java学习笔记(九)

java学习笔记(九)

开始学习java,并养成写博客的习惯,希望能够坚持下去,有志同道合的小伙伴可以一起学习java基础

二十四、封装、继承、多态

封装

禁止直接访问一个对象中数据的实际表示,应当通过操作接口来访问,这称为信息隐藏。

封装的核心:属性私有

package mifan.oop.Demo04;
//类
public class Student {

    private String name; //名字

    private int id;//学号

    private int age;//年龄

    private char sex;//性别

    //提供一些可操作这个属性的方法
    //提供一些public的get、set方法

    //get 获得这个数据
    public String getName(){
        return this.name;
    }

    //set 给这个数据设置值
    public void setName(String name){
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age){
        if(age>120 || age <0){
            this.age = 3;
        }else {
            this.age = age;
        }
    }
    //学习()
    //睡觉()
}
package mifan.oop;

import mifan.oop.Demo03.Pet;
import mifan.oop.Demo04.Student;

public class Application {
    public static void main(String[] args) {

//        Pet dog = new Pet();
//        dog.name = "旺财";
//        dog.age = 3;
//        dog.shout();
//
//        System.out.println(dog.age);
//        System.out.println(dog.name);

        Student s1 = new Student();
        s1.setName("mifan");
        System.out.println(s1.getName());

        s1.setAge(-1);
        System.out.println(s1.getAge());
    }
}

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • extands “扩展” 子类是父类的扩展
  • JAVA只有单继承(一个儿子一个爸爸,一个爸爸多个儿子)
  • 继承是类与类之间的一种关系,除此之外还有其他关系,比如:依赖、组合、聚合等
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
  • 子类和父类之间,从意义上讲应该具有“子类 is a 父类”的关系
  • java中所有类都默认继承object类
package mifan.oop;

import mifan.oop.Demo03.Pet;
import mifan.oop.Demo05.Student;

public class Application {
    public static void main(String[] args) {

        Student student = new Student();
        student.say();//子类继承父类,会拥有父类的全部方法()
        //public
        //protected
        //default
        //public

    }
}

package mifan.oop.Demo05;

public class Person {
    public void say(){
        System.out.println("我说话了");
    }
}
package mifan.oop.Demo05;
//学生 is 人
public class Student extends Person{
        //CTRL+ H 打开继承树结构
}

super

super 用于子类调用父类(父类私有变量除外)

package mifan.oop;

import mifan.oop.Demo03.Pet;
import mifan.oop.Demo05.Student;

public class Application {
    public static void main(String[] args) {

        Student student = new Student();
        student.test1();
    }
}

package mifan.oop.Demo05;
//学生 is 人
public class Student extends Person{
        //CTRL+ H 打开继承树结构
        private String name = "qq";
        public void print(){
            System.out.println("student");
        }
        public void test1(){
            print();
            this.print();
            super.print();
        }

}

package mifan.oop.Demo05;

public class Person {
    public void say(){
        System.out.println("我说话了");
    }

    protected String name = "mifan";

    public void print(){
        System.out.println("Person");
    }
}

super注意点:

  1. super调用父类的构造方法,必须在构造方法的第一个位置
  2. super 只能出现在子类的方法或者构造方法中
  3. super 和 this 不能同时调用构造方法
  4. 父类存在有参构造,子类想要调用父类的无参构造时,父类必须显式定义无参构造

子类无参构造会自动调用父类的无参构造

package mifan.oop;

import mifan.oop.Demo03.Pet;
import mifan.oop.Demo05.Student;

public class Application {
    public static void main(String[] args) {

        Student student = new Student();

    }
}

package mifan.oop.Demo05;
//学生 is 人
public class Student extends Person{

    public Student() {
        //此处存在隐藏代码,调用父类的无参构造
        System.out.println("student");
    }
}

package mifan.oop.Demo05;

public class Person {
    public void say(){
        System.out.println("我说话了");
    }

    //无参构造
    public Person() {
        System.out.println("person");
    }

    protected String name = "mifan";

    public void print(){
        System.out.println("Person");
    }
}

方法重写

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符范围可以扩大 public>protected>default>private
  4. 只有非静态方法存在重写
  5. 抛出异常范围可以被缩小,不能扩大
  6. 重写快捷键 alt + insert overide

1.静态方法

package mifan.oop;

import mifan.oop.Demo05.A ;
import mifan.oop.Demo05.B ;

public class Application {
    public static void main(String[] args) {

        //方法的调用只和左边定义的数据类型有关
        A a = new A();
        a.test();
        //父类的引用指向子类
        B b = new A();
        b.test();
    }
}

package mifan.oop.Demo05;

public class A extends B{
    public static void test(){
        System.out.println("A=>test");
    }
}

package mifan.oop.Demo05;
//重写都是方法的重写,跟属性无关
public class B {
    //静态方法
        public static void test(){
            System.out.println("B=>test");
        }
}

2.非静态方法重写

package mifan.oop;

import mifan.oop.Demo05.A ;
import mifan.oop.Demo05.B ;

public class Application {
    public static void main(String[] args) {

        //静态方法的调用只和左边定义的数据类型有关
        A a = new A();
        a.test();
        //父类的引用指向子类
        B b = new A();//子类对父类进行重载
        b.test();
    }
}

package mifan.oop.Demo05;
//重写都是方法的重写,跟属性无关
public class B {
    //非静态方法
        public void test(){
            System.out.println("B=>test");
        }
}

package mifan.oop.Demo05;

public class A extends B{
    public  void test(){
        System.out.println("A=>test");
    }
}

多态

  • 同一种方法可以根据发送对象不同而采取多种不同的行为方式
  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
  • 多态存在的条件
    • 有继承关系
    • 子类重写父类方法
    • 父类引用指向子类的对象
  • 多态是方法的多态,不是属性的多态
package mifan.oop;

import mifan.oop.Demo05.A ;
import mifan.oop.Demo05.B ;
import mifan.oop.Demo06.Person ;
import mifan.oop.Demo06.Student ;
public class Application {
    public static void main(String[] args) {
        //一个对象实际类型是确定的,但是可以指向的引用类型是不确定的,父类的引用指向子类
        Student s1 = new Student();
        Person s2 = new Student();
        Object s3 = new Student();//Person类的父类

        s2.run();
        s1.run();
        //s1可以调用Person和Student的方法
        //s2可以调用Person ,不可以调用Student的方法
        s1.eat();
        //s2.eat(); 对象能执行哪些方法,主要看对象左边的类型
        ((Student)s2).eat();//强制转换Person类为Student类
    }
}

package mifan.oop.Demo06;

public class Person {

    public void run(){

    }
}
package mifan.oop.Demo06;

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("son");
    }
    public  void  eat(){
        System.out.println("eat");
    }
}

二十五、引用类型转换 instanceof

x instanceof y ,x 和 y 之间要有继承关系才行

package mifan.oop;

import mifan.oop.Demo05.A ;
import mifan.oop.Demo05.B ;
import mifan.oop.Demo06.Person ;
import mifan.oop.Demo06.Student ;
import mifan.oop.Demo06.Teacher;

public class Application {
    public static void main(String[] args) {
        Object object = new Student();

        System.out.println(object instanceof  Student);
        System.out.println(object instanceof  Person);
        System.out.println(object instanceof Teacher);//与Student是兄弟类
        System.out.println(object instanceof String);//String 是 Object下的类 编译通过 ,但是与Student无关 False
        System.out.println("****************");
        Person person = new Student();
        System.out.println(person instanceof  Student);
        System.out.println(person instanceof  Person);
        System.out.println(person instanceof Teacher);//Teacher与Person是父子类 ,编译通过,Teacher与Student不是父子类False
 
    }
}

package mifan.oop.Demo06;

public class Person {

    public void run(){

    }
}

package mifan.oop.Demo06;

public class Teacher extends Person{
}

package mifan.oop.Demo06;

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("son");
    }
    public  void  eat(){
        System.out.println("eat");
    }
}

1.父类引用指向子类对象,反之不行
2. 子类转换父类,向上转型
3.父类转换子类,向下转型,强制转换
4.方便方法的调用,减少重复的代码,简洁

package mifan.oop;

import mifan.oop.Demo05.A ;
import mifan.oop.Demo05.B ;
import mifan.oop.Demo06.Person ;
import mifan.oop.Demo06.Student ;
import mifan.oop.Demo06.Teacher;

public class Application {
    public static void main(String[] args) {

        Student student = new Student();
        student.go();
        //类型转化: 父 子
        //高                  //低
        Person person = new Student();
        //student将这个对象转换为Student类型,我们就可以使用Student类型的方法了
        ((Student) person).go();
        // 子 转换 父类
        Person person1 = student;
       // person1.go;//子类转换成父类,可能丢失自己本来的方法
    }
}

package mifan.oop.Demo06;

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("son");
    }
    public void go(){

    }
}

二十六、static关键字

package mifan.oop.Demo07;

public class Student {

    private static int age; //静态的变量
    private double score;  //非静态的变量
// 静态方法是属于类的,动态方法属于实例对象,
// 在类加载的时候就会分配内存,可以 通过类名直接去访问
// 非静态成员(变量和方法)属于类的对象,
// 所以只有该对象初始化之后才存在,然后通过类的对象去访问。
// 也就是说如果我们在静态方法中调用非静态成员变量会超前,
// 可能会调用了一个还未初始化的变量。因此编译器会报错。
    public void run(){

    }

    public static void go(){

    }
    public static void main(String[] args) {
        go();

        //run(); 非静态方法不可以被静态调用
        
        Student s1 = new Student();


        System.out.println(Student.age);
        //System.out.println(Student.score);//未初始化,不能调用非静态变量
        System.out.println(s1.score);
        System.out.println(s1.age);
    }
}
  • 静态代码块:最先执行,只执行一次
  • 匿名代码块:构造方法之前执行,每次都执行
package mifan.oop.Demo07;

public class Person {
    {
        //代码块(匿名代码块)
        System.out.println("匿名方法");
    }

    static {
        //静态代码块
        System.out.println("静态代码块");
        //只运行一次
    }

    public Person(){
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println("==============");
        Person person2 = new Person();
    }
}

  • 静态导入工具包
package mifan.oop.Demo07;
import static java.lang.Math.PI;
import static java.lang.Math.random;
public class Test {

    public static void main(String[] args) {
        System.out.println(random());
        System.out.println(PI );
    }
}

  • final关键字的类,不能被继承

二十七、抽象类

  • 抽象类的所有方法,继承它的子类
  • 抽象类只能单继承,接口可以多继承
  • 不能new抽象类
  • 抽象类可以写普通方法,抽象方法必须在抽象类中
  • 抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法
package mifan.oop;

import mifan.oop.Demo05.A ;
import mifan.oop.Demo05.B ;
import mifan.oop.Demo06.Person ;
import mifan.oop.Demo06.Student ;
import mifan.oop.Demo06.Teacher;
import mifan.oop.Demo07.Action;

public class Application {
    public static void main(String[] args) {
       // new Action();//不能new抽象类,只能new它的子类
    }
}

package mifan.oop.Demo07;

//抽象类 abstract
public abstract class Action {
    public abstract void doSomething();//抽象方法,只有方法名字,没有方法实现
    //抽象类的所有方法,继承它的子类
    //抽象类只能单继承,接口可以多继承
    //不能new抽象类
    //抽象类可以写普通方法,抽象方法必须在抽象类中
    //抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法
}

package mifan.oop.Demo07;

public class A extends Action{
    @Override
    public void doSomething() {
        System.out.println("aaa");
    }
}

二十八、接口

  • 接口的本质是契约
  • 接口中的所有方法的定义都是抽象的 public abstract 可以省略
  • 接口中属性的定义使用 public static final,属性必须实例化
  • 接口不能被实例化,没有构造方法
  • 接口的实现使用implements ,可以实现多继承
  • 如果一个类中,既有抽象方法,又有非抽象方法,那么该类只能定义为抽象类,不能定义为接口
  • 如果一个类中,只有抽象方法,没有非抽象方法,那么该类可以定义为接口
package mifan.oop.Demo09;
//interface 定义的关键字 ,接口都需要有实现类
public interface UserService {
    //常量 public static final
    int AGE = 99;

    //接口中的所有定义都是抽象的 public abstract 可以省略
    public abstract void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);


}

package mifan.oop.Demo09;
//interface 定义的关键字,接口都需要有实现类
public interface TimeService {

    public abstract void test();
}

package mifan.oop.Demo09;
//类 可以实现接口 implements 接口
//抽象类 extends~
//实现了接口的类,就需要重写接口中的方法
//java可以利用接口实现多继承,
public class UserServiceImpl implements UserService,TimeService{
    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void test() {

    }
}

二十九、N种内部类

1.内部类

package mifan.oop;

import mifan.oop.Demo05.A ;
import mifan.oop.Demo05.B ;
import mifan.oop.Demo06.Person ;
import mifan.oop.Demo06.Student ;
import mifan.oop.Demo06.Teacher;
import mifan.oop.Demo07.Action;
import mifan.oop.Demo10.Outer;
public class Application {
    public static void main(String[] args) {
        Outer outer = new Outer();
        //通过这个外部类来实例化内部类~
        Outer.Inner inner = outer.new Inner();
        inner.in();
        inner.get();
    }
}

package mifan.oop.Demo10;

public class Outer {
    private int id;
    public void out(){
        System.out.println("这是外部类的方法");
    }

    public class Inner{
        public void in(){
            System.out.println("这是内部类的方法");
        }
        public void get(){
            //获得外部类的属性
            System.out.println(id);
            Outer outer = new Outer();
            outer.out();
        }
    }
}

每一个牛逼人都有一段苦逼的时光,只要能像傻逼一样坚持下去,终会牛逼! 加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值