暂无权限

加入尚新途,才有权限看这些视频哦!

点击前往
×
问答
wmk
1楼
private int testPrivate;
        int testDefault;  //这里为什么不用加修饰符default
protected int testProtected;
public int testPublic;


尚新途

这个是因为java默认的修饰符就是default

学学Java吧
2楼

图片.png为什么 我的protected 就能引用呢老师


尚新途

把代码发我吧

一个男人
3楼

1、搞不清这是哪里出了问题跟视频对了好几次


尚新途

依然是访问权限修饰符的问题,你的是private。

尚新途

可老师的好像也是private?

尚新途

肯定不是的,你在看看视频。

一个男人
4楼

1、为什么这个调用格式是这样的?new.ChildClass().f();???

   以前调用不应该是

   ChildClass c1=new ChildClass;

   c1.f();这样子写吗?

5.png

尚新途

一样的,只是new ChildClass()这个只能调用一次。

尚新途

哦~也就是一种功能多种实现方法,还是按老办法吧,不然总是记不住那么多还容易搞混

尚新途

嗯嗯 这些到后面用的多了就记住了,不用担心。

一个男人
5楼


1、为什么我这个会报错?同一个包下面的


尚新途

因为你的访问权限修饰符是private,他只能在本类中访问


????
6楼

老师你好

我不理解图中报错的原因屏幕截图 2022-06-09 104620.png

尚新途

这个,同学把完整的代码发过来吧。

尚新途

屏幕截图 2022-06-12 105115.png

;

{
   ;
   ;
                ;
   ;

    =;       =;    =;      =;      ([] args) {

    }
}

{
    =;       =;    =;      =Person();



    (){
        ..println(.+);
    }

}

{=Person();
    =.;
    (){
        ..println(.+.);
    }
}


尚新途

你这个要写在main方法里呀,要不然直接new对象肯定是不行的。

尚新途

老师

为什么在main()外直接赋值给声明过的变量不行,编译器应该知道是哪个变量啊,没超过成员变量的作用域啊

尚新途

在main()外直接赋值是可以的,但是new的话不行,这个必须写在main方法里,main是程序执行的入口。

尚新途

抱歉,我没有表述清楚我的问题。

我是想问在这个Person类中,我声明一个变量int a=testpublic;然后再给它赋一次值 a=5;

就是这次赋值,a=5;为什么会报错?a是已经声明过的变量,5也是int类型。我实在是想不出来是什么原因。

尚新途

Java是不能直接在类中对变量进行赋值的,只能在定义的时候赋值,或者在方法中赋值,或者在代码块中赋值。

????
7楼

老师你好

为什么在同一个包中,继承person类能访问public修饰的变量

不继承person类访问不了public修饰的变量。public不是公开的吗?

不同包的非子类也无法public修饰的变量


尚新途

继承可以直接访问父类,不继承的话先要new对象,然后才可以访问该对象内的属性和方法。

A
8楼

老师,在不定义数据类型的时候直接testprotected=20表示什么含义,为什么这样写调用super显示的是20,而int testprotected=20调用super显示的是正常的10?

image.png


image.pngimage.png

尚新途

子类没有定义int 变量 直接testprotected=20;这样是调用的父类的testprotected变量。

你调用的父类的并赋值了,所所以输出父类的testprotected就是20了。

你再在子类定义testprotected并赋值那是子类的变量所以调用父类,父类的变量没有改变还是10.

D
9楼

老师为啥我这的包建不了类了?

image.png

尚新途

image.png

静静 
10楼
TestSuper {
    (String[] args) {
        SonClass()}
}
FatherClass{
    (id){
        .=idSystem..println()}

    () {
        
    }
    
SonClass FatherClass{
    (){
        ()System..println()}
}

在onClass()方法中,使用super怎么调用父类的的带参构造方法呢?

尚新途

image.png

代码乱码了

程序员小岳
11楼
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的值呢?

image.png

尚新途

你这不是注释掉了吗,要不就是把项目发给我我看看


尚新途
public void test(){
            System.out.println(super.testProtected);
        }

那这个test里面的不能打印出来吗?还是必须在

public static void main(String[] args)

这个main主函数下才可以打印

尚新途

image.png

尚新途
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的对象去调用。

12楼

老师,不同包中的子类可以访问父类的Protected成员,那第一个报错是哪里错了

image.png

image.png

尚新途

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

image.png

任仕诚
13楼

image.png

老师默认修饰符是default,所以在变量前面再加上default就会报错,是吗?

方法和类的默认修饰符也是default吗?

尚新途

default修饰符不是有default这个关键字,而是在定义变量前什么都是不写就是default

159****4032
14楼
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方法是获取到当前属性字段的值的方法。

尚新途

image.png

但是这样也会报错,怎么回事?

那我不能定义多个对象了?

尚新途

image.pngimage.png

老师上个问题看错了,不好意思;但是这样不会覆盖啊怎样才算再次set值?

尚新途

这样:

 product.setName(product.getName()+"test"); 

product.setName("test");


159****4032
15楼
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方法是获取到当前属性字段的值的方法。

自我检测(5S)