我的学习笔记

vuePress-theme-reco 我的学习笔记    2020 - 2024
我的学习笔记 我的学习笔记

Choose mode

  • dark
  • auto
  • light
时间轴
github
author-avatar

我的学习笔记

24

Article

17

Tag

时间轴
github

JAVA面向对象

vuePress-theme-reco 我的学习笔记    2020 - 2024

JAVA面向对象

我的学习笔记 2020-09-08 java

# JAVA面向对象

在一开始进行培训JAVA的时候立了雄心壮志,立志在一个月的时间内掌握JAVA的基础,事实上我天真了,因为这个培训是项目驱动,导致JAVA的基础老师只讲了一个星期(本来只讲一天,这个也是因为班里有很多和我一样不了解JAVA的同学老师才不得不妥协进行一些JAVA基础知识的讲解)。但是上面那些都是借口,我会在最近抽时间学习JAVA基础来达到对一整个项目有基础了解目的,让我们拭目以待JAVA第二轮的学习

JAVA是一门面向对象的语言,并且JAVA现在依然是应用最多的后端语言。那么今天就来学习下JAVA的面向对象。

什么叫做面向对象?

面向对象是模型化的,我们在编程的过程中只需要抽象一个类,就可以创建出来一类的对象。并且可以赋予这些对象属性(静态的)和方法(动态的)。这也就是我们为什么称万物皆对象,因为我们可以将这个世上的任何一个对象找出一些共性抽象为类。

接下来我们需要了解面向对象的三大特性是

# 封装

  • 隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
  • 属性和处理属性的方法集合起来。把数据及数据的操作方法放在一起,作为一个相互依存的整体即对象。
class App{
    private final String v1="我是一个外部不能修改的类";
    public void f1(){
        System.out.println("我是一个类,展示了类的封装性");
        System.out.println("V1:"+v1);
    }
}

# 继承

  • 提高代码复用性;继承是多态的前提。

  • JAVA之间的继承只能是单继承(Ps:在JAVA中可以通过接口来实现多继承,接口类似于类只是为了实现多继承)

  • JAVA中的类顶级父类是java.lang.Object这个类,所以Object这个类中所有的非私有属性和方法是任何一个对象都拥有的

    class Car {
    	String color;
    	int speed;
    }
    class Bmw extends Car {
    }
    class Audi extends Car {
    	public void f1() {
    		System.out.println("我是Audi");
    	}
    }
    class Auto extends Car {
    }
    public class App {
    	public static void main(String[] args) {
    		Bmw b = new Bmw();
    		Audi a = new Audi();
    		Auto au = new Auto();
    	}
    }  
    
  • 每当输出一个对象的时候,其实会调用该对象的toString方法,输出的就是toString方法的返回值(char[] 除外)

    class Person {
    	int id;
    	String name;
    
        //构造方法
    	Person(int id, String name) {
    		this.id = id;
    		this.name = name;
    	}
    
    	@Override
    	public String toString() {
    		return "你愁啥";
    	}
    }
    
    public class App {
    	public static void main(String[] args) {
    		Person p=new Person(11,"柯南");
    		System.out.println(p);
    		System.out.println(p.toString());
    	}
    }
    
  • super()代表父类特征

    • 在每个类的构造方法的第一句总是super()这行代码,无论我们写不写JAVA都会在底层执行的时候给我们加上
    • super()代表调用父类的构造方法
    class Person {
    	Person() {
    		System.out.println("Person构造函数");
    	}
    }
    class Student extends Person {
    	public Student() {
    //		super();
    		System.out.println("Student构造方法");
    	}
    }
    public class App {
    	public static void main(String[] args) {
    		Student s = new Student();
    	}
    }
    
    

# 多态

  • 父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。

# 向上转型

所谓向上转型就是一个父类引用指向了子类的对象(Ps:发生向上转型时,子类独有的属性和方法无法使用)

向上转型也是多态的前提,一个类型可以根据情况转变为不同的类

class Person {
	void eat() {
		System.out.println("我吃");
	}
	void run() {
		System.out.println("我跑");
	}
}
class Student extends Person {
	void study() {
		System.out.println("好好学习");
	}
}
public class App {
	public static void main(String[] args) {
		Person s = new Student();
		s.eat();
		s.run();
	}
}
  • 发生向上转型时
    • 最终调用的方法只和new对象有关,也就是new的是谁,就调用谁的方法(Ps:这个方法能不能调用取决于父类中有没有这个同名的方法,并且向上转型发生时子类独有的属性和方法无法调用)
    • 调用的属性只和类型有关。也就是不管是谁new的,只会调用父类的属性
class Fu {
	int a = 10;
	void f1() {
		System.out.println("父类f1方法");
	}
}
class Zi extends Fu {
	int a=30;
	@Override
	void f1() {
		System.out.println("子类f1方法");
	}
}
public class App{
	public static void main(String[] args) {
		Fu c = new Zi();
		System.out.println(c.a);
		c.f1();
	}
}

# 向下转型

# 接口

由于JAVA中只能进行class的单继承的模式,所以出现了接口可以模拟多继承

interface Monster {
	// 这就是一个抽象方法
	void destory();
}

interface Vampire {
	void drinkblood();
}

class Darcula implements Monster, Vampire {
	@Override
	public void destory() {
		System.out.println("我破坏");
	}
	@Override
	public void drinkblood() {
		System.out.println("我吸血我吸吸");
	}
	public void fly() {
		System.out.println("我飞飞飞");
	}
}

public class App {
	public static void main(String[] args) {
		Darcula d = new Darcula();

		d.destory();
		d.drinkblood();
		d.fly();
	}
}