老师最后一个问题的外部调用是什么意思
从当前类以外的其他类、代码位置去访问或调用类的成员(属性、方法等)
private int testPrivate; int testDefault; //这里为什么不用加修饰符default protected int testProtected; public int testPublic;
这个是因为java默认的修饰符就是default
为什么 我的protected 就能引用呢老师
把代码发我吧
1、搞不清这是哪里出了问题跟视频对了好几次


依然是访问权限修饰符的问题,你的是private。
可老师的好像也是private?
肯定不是的,你在看看视频。
1、为什么这个调用格式是这样的?new.ChildClass().f();???
以前调用不应该是
ChildClass c1=new ChildClass;
c1.f();这样子写吗?

一样的,只是new ChildClass()这个只能调用一次。
哦~也就是一种功能多种实现方法,还是按老办法吧,不然总是记不住那么多还容易搞混
嗯嗯 这些到后面用的多了就记住了,不用担心。
1、为什么我这个会报错?同一个包下面的


因为你的访问权限修饰符是private,他只能在本类中访问
老师你好
我不理解图中报错的原因
这个,同学把完整的代码发过来吧。

;
{
;
;
;
;
=; =; =; =; ([] args) {
}
}
{
=; =; =; =Person();
(){
..println(.+);
}
}
{=Person();
=.;
(){
..println(.+.);
}
}
你这个要写在main方法里呀,要不然直接new对象肯定是不行的。
老师
为什么在main()外直接赋值给声明过的变量不行,编译器应该知道是哪个变量啊,没超过成员变量的作用域啊
在main()外直接赋值是可以的,但是new的话不行,这个必须写在main方法里,main是程序执行的入口。
抱歉,我没有表述清楚我的问题。
我是想问在这个Person类中,我声明一个变量int a=testpublic;然后再给它赋一次值 a=5;
就是这次赋值,a=5;为什么会报错?a是已经声明过的变量,5也是int类型。我实在是想不出来是什么原因。
Java是不能直接在类中对变量进行赋值的,只能在定义的时候赋值,或者在方法中赋值,或者在代码块中赋值。
老师你好
为什么在同一个包中,继承person类能访问public修饰的变量
不继承person类访问不了public修饰的变量。public不是公开的吗?
不同包的非子类也无法public修饰的变量


继承可以直接访问父类,不继承的话先要new对象,然后才可以访问该对象内的属性和方法。
老师,在不定义数据类型的时候直接testprotected=20表示什么含义,为什么这样写调用super显示的是20,而int testprotected=20调用super显示的是正常的10?



子类没有定义int 变量 直接testprotected=20;这样是调用的父类的testprotected变量。
你调用的父类的并赋值了,所所以输出父类的testprotected就是20了。
你再在子类定义testprotected并赋值那是子类的变量所以调用父类,父类的变量没有改变还是10.
老师为啥我这的包建不了类了?


TestSuper {
(String[] args) {
SonClass()}
}
FatherClass{
(id){
.=idSystem..println()}
() {
}
SonClass FatherClass{
(){
()System..println()}
}在onClass()方法中,使用super怎么调用父类的的带参构造方法呢?

代码乱码了
package com.bjsxt.test.encapsulation.b;
import com.bjsxt.test.encapsulation.a.Person;
public class Teacher extends Person{
public void test(){
System.out.println(super.testProtected);
}
public static void main(String[] args) {
Person p=new Person();
//System.out.println(p.testProtected);不能访问父类对象的protected成员
}
}老师您好,我这个代码为什么打印不出来testProtected的值呢?

你这不是注释掉了吗,要不就是把项目发给我我看看
public void test(){
System.out.println(super.testProtected);
}那这个test里面的不能打印出来吗?还是必须在
public static void main(String[] args)
这个main主函数下才可以打印

package com.bjsxt.test.encapsulation.b;
import com.bjsxt.test.encapsulation.a.Person;
public class Teacher extends Person{
public void test(){
System.out.println(super.testProtected);
}
public static void main(String[] args) {
Teacher p=new Teacher();
//System.out.println(.testProtected);不能访问父类对象的protected成员
p.test();
}
}老师,这样是不是就完成了对test()方法的调用呢?
对,通过new的对象去调用。
老师,不同包中的子类可以访问父类的Protected成员,那第一个报错是哪里错了


你的这个不是protected成员啊!!!


老师默认修饰符是default,所以在变量前面再加上default就会报错,是吗?
方法和类的默认修饰符也是default吗?
default修饰符不是有default这个关键字,而是在定义变量前什么都是不写就是default
package com.pratice;
/**
* 打印出实心10*10,空心10*10正方形
* 封装成方法,便于重用。
*/
public class homeWork2{
private int x,y;
public int getX() {
return x;
}
public void setX(int x) {
if(x<0){
this.x = 5;
}
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
if(y<0){
this.y = 5;
}
this.y = y;
}
public static void Cicle(int x,int y) {
if (x != y) {
System.out.println("参数不相等,无法打印正方形,打印出错!!!");
} else {
System.out.println(" ===打印实心正方形===");
for (int i = 1; i <= x; i++) {
for (int j = 1; j <= y; j++) {
System.out.print("*"+"\t");
}
System.out.println();
}
System.out.println(" ===打印空心正方形===");
for (int i = 1; i <= x; i++) {
for (int j = 1; j <= y; j++) {
if (i == 1 || i == x || j == 1 || j == y) {
System.out.print("*"+"\t");
} else System.out.print(" "+"\t");
}
System.out.println();
}
}
}
}
class Text{
public static void main(String[] args) {
homeWork2 C = new homeWork2();
C.setX(15);
C.setY(15);
C.Cicle(C.getX(),C.getY());
}
}如果把set()方法换成int类型,return set(x),那把C.set()传入Circle()里面就好了,可以不用get()方法了?
set方法是给某个属性进行赋值,如果赋值后,再次set值会覆盖之前的值。
get方法是获取到当前属性字段的值的方法。

但是这样也会报错,怎么回事?
那我不能定义多个对象了?


老师上个问题看错了,不好意思;但是这样不会覆盖啊怎样才算再次set值?
这样:
product.setName(product.getName()+"test");
product.setName("test");