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");
com.praticehomeWork2{ () { } (x) { (x<){ .= } .= x} () { } (y) { (y<){ .= } .= y} (xy) { (x != y) { System..println()} { System..println()(i = i <= xi++) { (j = j <= yj++) { System..print(+)} System..println()} System..println()(i = i <= xi++) { (j = j <= yj++) { (i == || i == x || j == || j == y) { System..print(+)} System..print(+)} System..println()} } } } Text{ (String[] args) { homeWork2 C = homeWork2()C.() } }
如果这样封装,为啥我重写的set get方法对我输入的值没有进行判断?那set get方法有什么用?
com.praticehomeWork2{ () { } (x) { (x<){ .= } .= x} () { } (y) { (y<){ .= } .= y} (xy) { (x != y) { System..println()} { System..println()(i = i <= xi++) { (j = j <= yj++) { System..print(+)} System..println()} System..println()(i = i <= xi++) { (j = j <= yj++) { (i == || i == x || j == || j == y) { System..print(+)} System..print(+)} System..println()} } } } Text{ (String[] args) { homeWork2 C = homeWork2()C.()} }
如果这样封装,为啥我重写的set get方法对我输入的值没有进行判断?那set get方法有什么用?
同学,提交代码的时候选择 java 语言 ,老师这边看着乱码了
老师我懂了,就是要通过setX()获取边长,然后再传入Circle函数里,
现在我又有一个问题,我们通过快捷键重写的set()方法是void类型的,但是如果把void类型换成int类型
那可以直接传入Circle()函数里面,那是不是就不用get()方法了呀?好像老高在课上没有详细讲这个
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类型,那把C.set()传入Circle()里面就好了,可以不用get()方法了?
set方法是给某个属性进行赋值,如果赋值后,再次set值会覆盖之前的值。
get方法是获取到当前属性字段的值的方法。