如下图:
分析错误提示
从代码提示中可以看出,在TenantId类中,由于TenantId构造函数是私有的,所以在外面不能访问此构造函数
代码例子:
test.java
package com.yubai.sample.repository;
public class test {
public static void main(String[] args) {
Book b = new Book("java");
System.out.println(b.getName());
}
}
此时 Book b = new Book(“java”);就会报错’Book(java.lang.String)’ has private access in ‘com.yubai.sample.repository.Book’
Book.java
package com.yubai.sample.repository;
public class Book {
private String name;
private Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
分析代码关于访问私有属性的方法
从Book.java代码可以看出:
1. name属性的值无法访问,因为对象无法创建,有参构造函数是private无法创建对象,而Book.java中也没有提供无参构造函数,所以无法创建对象,那么无法访问getName()方法,从而无法获得name属性的值。
2. 一般在非私有构造函数的情况下,如果想修改私有属性,是通过setName()
3. 如果想访问name属性的值,又不想被外界通过setXXX()方法改变name属性的值,那么只能在内部类中设置好name的初始值,并且把它设为私有的,外部不能修改的,解决办法如下两种(目前我能想到的)。
解决办法:
第一种:
首先初始化属性值:通过在类内部调用私有构造函数创建(构造函数私有,外部将无法创建对象,也就是无法调用私有构造函数,那么将无法修改name属性的值)
设置属性为全局变量:设置属性为public static final,因为可以在外部import类名.属性名后,可以直接使用属性名。如下代码:
package com.yubai.sample.repository;
public class Book {
private String name;
public static final Book BOOK = new Book("java");
private Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return BOOK.name;
}
}
test.java
package com.yubai.sample.repository;
import static com.yubai.sample.repository.Book.BOOK;
public class test {
public static void main(String[] args) {
System.out.println(BOOK);
}
}
第二种:初始化属性值,仅提供getName()方法。
package com.yubai.sample.repository;
public class Book {
private String name = "aaa";
public String getName() {
return name;
}
}
test.java
package com.yubai.sample.repository;
import static com.yubai.sample.repository.Book.BOOK;
public class test {
public static void main(String[] args) {
Book book = new Book();
System.out.println(book.getName());
}
}
相比较第一种方法,我觉得第一种更方便对于获取name属性的值。因为第一种方法只要引入import static com.yubai.sample.repository.Book.BOOK; 就可以直接运用BOOK属性。而第二种方法要想获得name属性的值,需要通过String name= book.getName();语句来获得,相对比较繁琐。 根据不同的需求运用不同的方法。
分析代码关于static final 属性外部怎么直接使用
如果要使用static final的属性,则需要import static 包名.类名.属性,而不是import类名
代码如下:
test.java
package com.yubai.sample.repository;
//import static com.yubai.sample.repository.Book.BOOK;
import static com.yubai.sample.repository.Book;//报错。cannot resolve symbol 'BOOK'
public class test {
public static void main(String[] args) {
System.out.println(BOOK);//报错。cannot resolve symbol 'BOOK'
}
}
当直接使用BOOK属性时,报错,应该导入注释掉的包
当导入的是类名,则使用BOOK属性的格式:Book.BOOK(类名.属性名)
显然直接使用BOOK属性较Book.BOOK方便。
如下导入的包是类名
package com.yubai.sample.repository;
import static com.yubai.sample.repository.Book;
public class test {
public static void main(String[] args) {
System.out.println(Book.BOOK);
}
}
分析代码关于不能访问方法,因为无法创建对象
代码块
Book.java
package com.yubai.sample.repository;
public class Book {
private String name;
public static final Book BOOK = new Book("spring boot");
private Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
test.java
package com.yubai.sample.repository;
public class test {
public static void main(String[] args) {
Book b = new Book(); //报错:'Book(java.lang.String)' has private access...
System.out.println(b.getName());
}
}
此时Book b = new Book();会报错,因为Book.java中没有显示写无参构造函数, 当没有显示的写无参构造函数时,有参构造函数覆盖了默认的无参构造函数,所以不能用无参构造函数创建对象,没有对象将无法调用方法。