> Java > java지도 시간 > 본문

Java 기본 클래스 및 객체, 싱글톤 패턴, 상속

巴扎黑
풀어 주다: 2017-06-26 11:29:32
원래의
1009명이 탐색했습니다.

Java 클래스 및 객체

일반 클래스는 공개 또는 기본값만 가능합니다. 공개인 경우 클래스 이름은 파일 이름과 동일해야 합니다. 일반적으로 파일에는 하나의 클래스만 작성되므로 이 클래스는 일반적으로 public으로 추가됩니다.

현재 클래스만 필요하기 때문에 내부 클래스도 비공개 및 보호될 수 있습니다. 일반적으로 비공개입니다. 이렇게 하면 외부 클래스만 직접 액세스할 수 있습니다. 따라서 내부 데이터가 공개인지, 비공개인지, 기본인지는 중요하지 않습니다.

public class Out {private int d = 10;public int add() {      // 外部类不能直接访问内部类的数据,除非new出内部类对象,如下  // Out.In abc = new Out().new In();a = 3; // falseb = 5; // false}  // 内部类private class In {private int a = 100;int b;public int c;public void add() {
            System.out.println(d); // true, 内部类却可以直接访问外部类的数据}
    }public static void main(String[] args) {
        Out bb = new Out();
        Out.In abc = new Out().new In();
        bb.d = 20; // 本类可以直接访问private,一般不这样,而是写个set函数,搭配get函数System.out.println(aa.a); // 100System.out.println(bb.d); // 被修改为20}
}
로그인 후 복사
  • 익명 개체

new Abc().run(); // 调用一次后这个对象就销毁new Abc().run(); // 这是另外一个Abc对象了
로그인 후 복사
  • private 변수 정보

  • private 변수: 데이터를 캡슐화하고 사용자에게 메서드만 표시합니다. 예를 들어 비공개 문자열 이름은 마음대로 수정할 수 없지만 setName() 및 getName() 메서드를 호출하여 데이터 캡슐화를 실현할 수 있어 더 안전합니다.

  • Private 방식: 사용자가 호출하는 함수를 사용하지 않고 일부 내부 구현 세부 사항을 완료하여 비공개로 정의할 수 있습니다. 예를 들어, 선택 정렬 알고리즘은 두 개의 데이터를 교환하는 프로세스를 포함하고 함수로 캡슐화되는 메서드로 작성됩니다. 이 함수는 사용자가 조작할 필요가 없으며(사용자는 sort()만 사용하면 됨) 이 swap()은 private으로 정의됩니다.

싱글턴 디자인 패턴

은 메모리에서 클래스 개체의 고유성을 보장할 수 있습니다. 여러 프로그램에 동일한 구성 정보 개체를 사용해야 하는 경우 이 경우 개체의 고유성을 보장해야 합니다. , Singleton이 필요합니다.

도구 클래스에서 개체 구성원 데이터를 사용(접근)하지 않으면 개체를 생성할 필요가 없습니다. 객체 생성을 방지하기 위해 생성자를 private으로 정의할 수 있습니다.

객체의 고유성을 어떻게 보장할 수 있나요?

  1. 다른 프로그램이 new를 사용하여 이 클래스의 객체를 생성하는 것을 허용하지 말고 생성자를 private으로 설정하세요.

  2. 이 클래스에 고유한 클래스 인스턴스를 생성하세요

  3. 다른 프로그램에서 이를 얻을 수 있도록 메서드를 제공하세요. 고유한 개체

단일 케이스 디자인 단계

  1. 이 클래스의 생성자를 비공개합니다.

  2. 새 개체를 통해 이 클래스의 개체를 이 클래스에 넣습니다.

  3. 공용 메서드를 정의하고 2를 추가합니다. 생성된 개체가 반환됩니다.

Hungry 모드

// 饿汉式--不管用不用得到,先new出一个再说public class SingleDemo {// private不能将这个实例暴露出去,只能通过getInstance()获取,另为何是static?private static SingleDemo s = new SingleDemo();private SingleDemo() {}// 供外界调用来获取这个对象public static SingleDemo getInstance() {return s;
    }  // 只有本类中可以new对象并调用addpublic void add() {
        System.out.println("danli");
    }public static void main(String[] args) {      // 本类可以newSingleDemo a = new SingleDemo();
        a.add();
    }
}public class Test {public static void main(String[] args) {      // fasle, 其他类中若用到这个单例,不能newSingleDemo aa = new SingleDemo();      // true  SingleDemo aa = SingleDemo.getInstance();
    }
}
로그인 후 복사

Lazy 모드

// 另外一种单例设计模式--懒汉模式--用到了才new,延时加载public class SingleDemo {// 先设为空private static SingleDemo s;private SingleDemo() {}// 供外界调用来获取这个对象public static SingleDemo getInstance() {      if (s == null)
        s = new SingleDemo();return s;
    }
로그인 후 복사

Q: 왜 멤버 변수는 정적이고 메서드는 정적인가요?

A: new는 다른 클래스에서 새 개체를 생성할 수 없으므로 getInstance()를 호출할 수 없습니다. 정적 메서드로 설정하면 Single.getInstance()</를 통해 얻을 수 있습니다. code> 새 개체가 필요하지 않으며 정적 메서드의 데이터도 정적이어야 합니다. 따라서 이 SingleDemo 개체도 정적이어야 합니다. <code>Single.getInstance()来获取而无需new对象,又静态方法里的数据也必须是static的。故这个SingleDemo对象也必须是static的。

Q:饿汉模式和懒汉模式的区别?
A:懒汉模式是延时加载的,用到了才new;在多线程时不能保证对象的唯一性,是线程不安全的。饿汉模式是随着类的加载,就new出这个对象,不管用不用得上,是线程安全的。

继承

Java一般是单继承,不能直接多继承 --> 因为多个父类可能有相同的成员,调用会导致二义性。

但是可以多层继承,如 A --> B -->C--> D,可以表示A继承自B,而B继承自C,以此类推。

  • 本类成员和局部变量之间用this区分

  • 子类、父类的成员同名时用super区分

  • 派生类也不能访问基类的private成员,但是确实是继承过来了,只是不能访问而已,可以调用父类的set、get函数来操作子类的private成员,对父类没影响。

  • 若成员是protected等权限更高的,则不用set、get

    Q: 배고픈 남자 모드와 게으른 남자 모드의 차이점은 무엇인가요?
    A:
  • Lazy 모드
  • 는 로딩이 지연되며, 멀티스레딩에서는 개체의 고유성을 보장할 수 없으며 스레드가 안전하지 않은 경우에만 사용된 후에만 새롭습니다.

    Hungry Man 모드

    는 클래스가 로드될 때 새 개체를 만드는 것입니다. 사용 여부에 관계없이 스레드로부터 안전합니다.
상속
Java는 일반적으로
    단일 상속
  • 을 가지며 직접 다중 상속을 할 수 없습니다. --> 여러 상위 클래스가 동일한 멤버를 가질 수 있으므로 호출하면 모호해집니다.

    그러나 A --> B -->C--> D와 같은
  • 다중 수준 상속
  • 을 수행할 수 있습니다. 이는 A가 B에서 상속되고 B가 C에서 상속된다는 의미일 수 있습니다.

    이 클래스의 멤버와 지역 변수를 구분하려면 this를 사용하세요.

하위 클래스와 상위 클래스의 멤버 이름이 같은 경우 super를 사용하여 구분하세요.
🎜🎜Derived 클래스는 기본 클래스의 private 멤버에 액세스할 수 없지만 실제로 상속되었지만 액세스할 수 없습니다. 상위 클래스의 set 및 get 함수를 호출하여 작동할 수 있습니다. 하위 클래스의 비공개 멤버는 상위 클래스에 영향을 미치지 않습니다. 🎜🎜🎜🎜보호된 회원이거나 더 높은 권한을 가진 회원이라면 set or get을 사용하지 않고도 해당 회원에 직접 접근할 수 있습니다. 🎜🎜🎜🎜상위 클래스와 하위 클래스의 멤버는 서로 독립적입니다. 하위 클래스가 자체 멤버를 변경해도 상위 클래스는 동일하게 유지됩니다. 🎜🎜🎜🎜
package Chap1;public class Fu {  // 父类的成员是私有的,子类继承过去了也不能直接访问
  private int age;private String name;public Fu(int age, String name) {this.age = age;this.name = name;
    }public int getAge() {return age;
    }public void setAge(int age) {this.age = age;
    }public String getName() {return name;
    }public void setName(String name) {this.name = name;
    }
}class Zi extends Fu {  // 特有的job,父不能访问private String job;Zi(int age, String name, String job) {super(age, name);this.job = job;
    }public String getJob() {return job;
    }  public static void main(String[] args) {
        Zi aa = new Zi(23, "Zi","Study");
        Fu bb = new Fu(55, "Fu");      // 改变子类不会影响父类aa.setAge(24);
        aa.setName("zi");      // zi 24 Study  // Fu 55System.out.println(aa.getName()+" "+aa.getAge() + " " + aa.getJob());
        System.out.println(bb.getName()+" "+bb.getAge());

    }
}
로그인 후 복사
🎜🎜🎜🎜하위 클래스는 암시적으로 super()를 실행합니다. 자식 객체가 새로 생성되면 상위 클래스의 생성자가 먼저 호출된 다음 하위 클래스의 생성자가 실행됩니다. 🎜🎜🎜🎜기본 생성자는 매개변수가 없습니다. 🎜매개변수가 있는 생성자는 매개변수가 없는 생성자를 재정의합니다🎜. 이때 super(args)를 명시적으로 사용해야 하며, 반드시 첫 번째 줄에 배치해야 합니다. super를 명시적으로 쓰지 않으면 매개변수가 없는 부모 클래스 생성자인 기본 super()🎜가 됩니다. 실행. 🎜🎜🎜🎜
class Fu {  // 构造函数
  Fu() {
    System.out.println("father");
  }  // 带参的构造函数
   public Fu(int age, String name) {this.age = age;this.name = name;
    }
}class Zi extends Fu {  
  Zi() {private String job;// super() 会打印“father”// 无参数时是默认构造器,这句super()可以不写。父类的构造函数默认执行,先执行// 
  }  
  Zi(int age, String name, String job) {// 若不写,会默认调用无参的super()打印fathersuper(age, name);this.job = job;
    }
}
로그인 후 복사
🎜
  • 类是public,构造函数也是public的。他们的修饰符是对应的。

一个对象的实例化过程

Person p = new Person();

  1. JVM读取Person.class文件,加载进内存;若有父类,会先加载父类。

  2. 在堆内存中开辟空间,分配地址。

  3. 在对象空间中,对对象的属性进行默认初始化,如int age = 0; String name = null;

  4. 显示初始化,如private int age = 9。若是子类,则会先调用父类的构造器。

  5. (子)类的 构造函数进行特定的初始化。如下程序中age变成100。

  6. 初始化后,将地址传递给引用变量。Person p <-- new Person();

package Test;// 先打印9// 再打印100public class Demo {private int age = 9;
    {
        System.out.println(age);
    }Demo(int age) {this.age = age;
    }public static void main(String[] args) {
        Demo aa = new Demo(100);
        System.out.println(aa.age);
    }
}
로그인 후 복사

위 내용은 Java 기본 클래스 및 객체, 싱글톤 패턴, 상속의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿