>  기사  >  Java  >  Java 클래스, 캡슐화, 상속된 메소드

Java 클래스, 캡슐화, 상속된 메소드

王林
王林앞으로
2023-04-28 11:19:14892검색

클래스 멤버란

정적으로 수정된 멤버 메서드와 멤버 변수를 클래스 멤버라고 합니다.

정적으로 수정한 멤버 변수를 클래스 변수라고 합니다.

정적으로 수정한 멤버 메서드를 클래스 메서드라고 합니다.

인스턴스 변수란 무엇입니까

멤버 static으로 수정되지 않는 메소드와 멤버 변수를 인스턴스 멤버라고 합니다

static으로 수정되지 않는 멤버 변수를 인스턴스 변수라고 합니다

static으로 수정되지 않는 멤버 메소드를 인스턴스 메소드라고 합니다

예:

public String name;  //这个就是实例成员(属性) 
public static int age;//这个就是类成员(属性) 

public void a(){
	System.out.println("我叫:"+this.name)
}                                    //这个没有加static的方法就是实例方法

public static void a(){           	//这个加了static的方法就是类方法
	System.out.println("我叫:"+this.name)
}

그렇다면 인스턴스 변수와 클래스 변수의 차이점은 무엇입니까?

  • 이 클래스의 모든 객체는 동일한 클래스 변수를 공유하지만 각 객체는 고유한 인스턴스 변수를 갖습니다.

  • 이 클래스의 모든 객체는 클래스 변수의 값을 변경할 수 있지만 각 객체는 클래스 변수의 값만 변경할 수 있습니다. 클래스 변수의 값입니다. 인스턴스 변수는 사용하기 전에 개체 이름에 따라 개체를 생성해야 합니다. 그러나 클래스 변수는 개체를 생성할 필요가 없습니다.

  • //定义一个类
    public class stu {
        public String name;  //这个类有一个名字这个属性,属于实例成员,也就是需要实例化对象了才可以使用
        //定义构造方法
        public stu(){}    //不管怎么样,都定义一个无参构造
        public stu(String name){    //定义有参构造,需要传入一个字符串名字
           this.name = name;         //这里若不使用this 关键字,那么是不会与上面的实例属性匹配
        }
        //定义方法
        public void a(){
            System.out.println(this.name);
        }
    }

    사용 이 클래스는:

    public class stu_Test {
        public static void main(String[] args) {
            //实例化两个对象,基于stu类
            stu s1 = new stu("小红");   
            stu s2 = new stu("小王");
            //使用stu类里面的方法
            s1.a();
            s2.a();
        }
        
        //stu s1 = new stu("小红");  将会输出小红
        //stu s2 = new stu("小王");  将会输出小王
    }
    //通过这个就可以明白每个对象都有属于自己的实例变量(属性)
  • 그럼 클래스 메서드와 인스턴스 메서드의 차이점은 무엇인가요?

이 클래스의 모든 개체는 클래스 메서드와 인스턴스 메서드를 공유합니다.

  • 클래스 메서드는 클래스 이름([매개변수])을 사용하여 호출할 수 있으므로 개체를 사용하기 전에 인스턴스화할 필요가 없습니다.

  • 인스턴스 메소드는 객체 이름을 사용합니다. 메소드 이름([매개변수]) 호출

  • 정적 키워드

  • Java 클래스는 두 가지 유형의 변수를 제공합니다. static 키워드로 수정된 정적 변수와 static 키워드 없이 수정된 인스턴스 변수입니다. 정적 변수는 클래스에 속하며 메모리에 하나의 복사본만 가지고 있습니다. 정적 변수가 위치한 클래스가 로드되는 한 정적 변수는 공간을 할당받아 사용할 수 있습니다. 정적 변수를 참조하는 방법에는 "class.static 변수"와 "object.static 변수"라는 두 가지가 있습니다.

정적 멤버 메서드:

정적 메서드는 객체를 생성하지 않고도 호출할 수 있는 클래스의 메서드입니다. , 비정적 메서드는 개체가 생성된 후에만 사용할 수 있습니다. 정적 메서드에서는 this 및 super 키워드를 사용할 수 없습니다. 왜냐하면 정적 메소드가 호출될 때 이 클래스의 객체가 아직 생성되지 않았을 수 있기 때문입니다. 생성되었더라도 어떤 객체의 메소드를 호출할지 결정할 수 없기 때문입니다.

  • 정적 사용:

  • 멤버 변수 수정

멤버 메소드 수정

  • 정적 코드 블록

  • 클래스 수정 [내부 클래스만 수정 가능, 즉 정적 내부 클래스]

  • 정적 가져오기 패키지

  • 정적 참고 사항: 정적은 정적에만 액세스할 수 있고, 비정적은 비정적 및 정적 모두에 액세스할 수 있습니다.

  • 캡슐화:
  • 캡슐화의 개념

  • 객관적인 것을 추상 클래스로 캡슐화하고, 클래스는 신뢰할 수 있는 클래스나 객체만 해당 속성과 메서드를 작동하도록 허용하고 신뢰할 수 없는 클래스나 객체를 숨길 수 있도록 하는 프로세스를 캡슐화라고 합니다. 요약: 귀하의 정보를 봉인하고 귀하가 신뢰하는 사람들만 이를 보고 사용할 수 있도록 허용하세요.

캡슐화된 분류

속성 캡슐화: 속성을 비공개(비공개)로 설정하고 클래스 내부 사용으로만 제한하세요

메서드 캡슐화: 메소드 캡슐화의 경우 외부에서 접근 가능한 메소드를 public으로 설정하고, 외부에서 접근할 수 없는 메소드를 private으로 설정합니다.

  • 캡슐화 사용

  • 캡슐화하기 전에 먼저 새로운 수식어를 알아봅시다. 클래스 내부에서 사용할 수 있습니다(즉, private으로 수정된 메서드와 속성은 이 클래스 내에서만 찾아 사용할 수 있고, 이 클래스 외부에서는 이 속성의 존재를 찾을 수 없으며 이는 캡슐화 효과도 달성합니다)
  • //给name这个属性进行封装
    private Strint name; //即可,这也我们在类外是找不到这个属性的存在的

    캡슐화되어 있으므로 이 캡슐화를 수정하여 사용할 수 있는 방법이 있을 겁니다. 네, 이것이 get/set 방식입니다

  • get/set 방식
public class stu {
    private String name; 
    public void setName(String name){    //set方法:对象调用这个方法,即可对私有属性进行修改
        this.name = name;   
    }
    public String getName(){         //get方法:对象调用这个方法,就可以使用该方法
        return name;
    }
}

용도:

public class stu_Test {
    public static void main(String[] args) {
    stu s =new stu();
    s.setName("小红");  //给name 这个私有属性修改值为小红
        System.out.println(s.getName());
   
}

//프로그램 실행 후, 출력 값은 다음과 같습니다. 하위 클래스이며 기존 클래스를 상위 클래스라고 합니다. 하위 클래스는 상위 클래스의 속성과 동작을 상속합니다.

상속 구문:

public class stu extends Student{   //在类名后加上extends,在写上继承的父类即可
//这里可以写父类没有发属性及方法
	public String ID;  //等等等等

}

참고: 상속은 상위 클래스의 전용 속성과 메서드를 상속할 수 없습니다! ! ! 비공개로 수정하는 한 상속되지 않습니다! ! !

하위 클래스 정보: 상위 클래스의 비공개 속성과 메서드를 갖는 것 외에도 하위 클래스는 자체 속성과 메서드를 확장할 수도 있습니다.

상속 사용:

상속은 단일 상속, 즉 클래스입니다. 부모 클래스만 있을 수 있습니다.

클래스가 특정 클래스를 명시적으로 상속하지 않는 경우 기본 상위 클래스인 java.lang.Object 클래스를 갖게 됩니다.

상위 클래스의 비공개 멤버 변수와 멤버 메서드를 상속합니다. 하지만 참고하세요: 하위 클래스는 상위 클래스의 생성 방법을 상속할 수 없습니다. 즉, 하위 클래스는 하나의 상위 클래스만 상속할 수 있습니다. 이 클래스가 다른 클래스를 상속하지 않으면 기본적으로 Object 클래스를 상속합니다(Java와 함께 제공됨).

부모 클래스의 생성자는 상속될 수 없습니다.

方法的重写:

@overriding

什么是方法重写?:

  • 子类根据需求从父类继承的方法进行重新编写(方法名一样)

  • 重写是可以使用super方法的方式来保留父亲的方法(super在后面讲到)

注意:构造方法不能被重写

方法重写的规则:

  • 方法名相同,参数列表相同(数量,顺序,数据类型)

  • 如果有返回值,返回值相同或者是其子类,访问权限不能严于父类

  • 父类的静态方法不能被重写为非静态方法,反之父类的非静态方法不能被重写为静态方法

  • 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法**(静态方法中无法使用super、this)**

  • 父类的私有方法不能被子类重写(private修饰的)

上代码:

1:定义一个类,有名字和年龄的属性,分别有get/set方法,成员方法是输出名字和年龄:

public class Person {
    private String name;
    private int age;

    //get/ste方法
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }

    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
    //成员方法:
    public void print(){
        System.out.println("我叫:"+this.name+","+"我今年:"+this.age+"岁");
    }
}

2:写一个类,继承Person类,并且这个类拥有自己的一个sex属性,提供get/set方法 并且重写父类的print方法,输出名字+年龄+性别

public class child extends Person{
    private String sex;      //这个child类继承了Person类,但也拥有自己的属性 sex性别
    public void setSex(String sex){
        this.sex = sex;
    }
    public String getSex(){
        return sex;
    }
    @Override
    //重写父类方法: 因为父类是输出名字和年龄,这里要输出名字,年龄和性别
    public void print(){
        System.out.println("我叫:"+getName()+","+"我今年:"+getAge()+"岁"+","+"我是"+sex+"孩子");
    }
}

3:新建测试类,测试两个类的继承、重写

//测试类,
public class Test {
    public static void main(String[] args) {
        child c = new child();
        c.setName("小红");
        c.setAge(20);
        c.setSex("男");
        c.print();
    }
}
//分别执行child继承person的set方法,使用重写后的方法,

//输出结果为: 我叫:小红,我今年:20岁我是男孩子

super关键字:

super代表的是父类对象

super的使用方式:

1:super.属性名 用于在子类中调用父类被隐藏的同名实例变量

2:super([参数列表]) 用于在子类的构造方法中调用父类的构造方法

注意事项:

  • 每一个子类的构造方法在没有显示调用super(),系统都会提供一个默认的super()

  • super() 书写在第一行

  • 可以在子类构造方法中显示调用super(),完成对特定父类构造方法的调用

简而言之:super就是调用父亲的属性和方法来使用

上代码:

1:新建一个类:定义age为20

public class super_test {
    public int age=20;
    public void print(){
        System.out.println(this.age);
    }
}

2:建第二个类,继承第一个类;

public class su2 extends super_test{
    public int age = 10;
    @Override
    public void print(){
        System.out.println(super.age);  //这里使用super,意思是使用父类的age
    }
}

3:建立测试类:

public class test {
    public static void main(String[] args) {
    su2 s = new su2();
    s.print();
	}
}

这样输出的就是20,是父类的age Java 클래스, 캡슐화, 상속된 메소드

this与super的区别:

  • super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函 数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)

  • this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的 形参与类中的成员数据同名,这时需用this来指明成员变量名

  • super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其 它构造方法。

  • super()和this()均需放在构造方法内第一行,尽管可以用this调用一个构造器,但却不能调用两个

  • this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造 函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意 义,编译器也不会通过。

  • this()和super()都指的是对象,所以,均不可以在static环境中使用。包括: static变量,static方法,static语句块。

  • 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

위 내용은 Java 클래스, 캡슐화, 상속된 메소드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제