熟知java(类和对象–引用和继承)
一、什么是JAVA中的引用?
引用的概念,如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用。
二、引用和指向
new Role();
代表创建了一个Role对象,但是只是创建,并不能访问它,为了访问它,我们会使用引用来代表这个对象:
Role r = new Role;
r这个变量是Role类型,又叫做引用
=的意思指的是r这个引用指向(意思是代表)右侧创建的对象
Role 对象 | 指向———— | 引用 r |
---|
public class Ro {
String name; //姓名
String sex;//性别
int age; //年龄
public static void main(String[] args) {
//创建一个对象
new Role();
//使用一个引用来指向这个对象
Role r = new Role();
}
}
三、多个引用,一个对象
多个引用(r1,r2)指向一个对象(Role)。
Role 对象指向————引用 r1
Role 对象指向————引用 r2
四、什么是JAVA中的继承?
在 Java 语言中继承就是子类继承父类的属性和方法,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的方法。
举个例子:动物有很多种,是一个比较大的概念。在动物的种类中,我们熟悉的有猫(Cat)、狗(Dog)等动物,它们都有动物的一般特征(比如能够吃东西,能够发出声音),不过又在细节上有区别(不同动物的吃的不同,叫声不一样)。
在 Java 语言中实现 Cat 和 Dog 等类的时候,就需要继承 Animal 这个类。继承之后 Cat、Dog 等具体动物类就是子类,Animal 类就是父类。
五、继承的作用
如果仅仅只有两三个类,每个类的属性和方法很有限的情况下确实没必要实现继承,但事情并非如此,事实上一个系统中往往有很多个类并且有着很多相似之处,比如猫和狗同属动物,或者学生和老师同属人。各个类可能又有很多个相同的属性和方法,这样的话如果每个类都重新写不仅代码显得很乱,代码工作量也很大。
这时继承的优势就出来了:可以直接使用父类的属性和方法,自己也可以有自己新的属性和方法满足拓展,父类的方法如果自己有需求更改也可以重写。这样使用继承不仅大大的减少了代码量,也使得代码结构更加清晰可见。
动物类(父类)
class Animal
{
public int id;
public String name;
public int age;
public int weight;
public Animal(int id, String name, int age, int weight) {
this.id = id;
this.name = name;
this.age = age;
this.weight = weight;
}
//这里省略get set方法
public void sayHello()
{
System.out.println("hello");
}
public void eat()
{
System.out.println("I'm eating");
}
public void sing()
{
System.out.println("sing");
}
}
狗类(子类)
class Dog extends Animal//继承animal
{
public Dog(int id, String name, int age, int weight) {
super(id, name, age, weight);//调用父类构造方法
}
}
猫类(子类)
class Cat extends Animal{
public Cat(int id, String name, int age, int weight) {
super(id, name, age, weight);//调用父类构造方法
}
}
坤类(子类)
class Chicken extends Animal{
public Chicken(int id, String name, int age, int weight) {
super(id, name, age, weight);//调用父类构造方法
}
//鸡下蛋
public void layEggs()
{
System.out.println("我是老母鸡下蛋啦,咯哒咯!咯哒咯!");
}
}
继承分为单继承和多继承,Java 语言只支持类的单继承
单继承,一个子类只有一个父类,如我们上面讲过的 Animal 类和它的子类。单继承在类层次结构上比较清晰,但缺点是结构的丰富度有时不能满足使用需求。
Java 虽然不支持多继承,但是 Java 有三种实现多继承效果的方式,分别是内部类、多层继承和实现接口。
内部类可以继承一个与外部类无关的类,保证了内部类的独立性,正是基于这一点,可以达到多继承的效果。
**多层继承:*子类继承父类,父类如果还继承其他的类,那么这就叫*多层继承。这样子类就会拥有所有被继承类的属性和方法。
五、JAVA中的继承的实现?
extends关键字
在 Java 中,类的继承是单一继承,也就是说一个子类只能拥有一个父类,所以extends只能继承一个类。其使用语法为:
class 子类名 extends 父类名{}
例如 Dog 类继承 Animal 类,它是这样的:
class Animal{} //定义Animal类
class Dog extends Animal{} //Dog类继承Animal类
子类继承父类后,就拥有父类的非私有的属性和方法。
测试代码:
class Animal {
public void sayHello()//父类的方法
{
System.out.println("hello,everybody");
}
}
class Dog extends Animal//继承animal
{ }
public class test {
public static void main(String[] args) {
Dog dog=new Dog();
dog.sayHello();
}
}
四、继承的特点?
继承的主要内容就是子类继承父类,并重写父类的方法。使用子类的属性或方法时候,首先要创建一个对象,而对象通过构造方法去创建,在构造方法中我们可能会调用子父类的一些属性和方法,所以就需要提前掌握 this 和 super 关键字。
创建完这个对象之后,再调用重写父类后的方法,注意重写和重载的区别。
this 和 super 关键字
this 和 super 关键字是继承中非常重要的知识点,分别表示当前对象的引用和父类对象的引用,两者有很大相似又有一些区别。
this 表示当前对象,是指向自己的引用。
this.属性 // 调用成员变量,要区别成员变量和局部变量
this.() // 调用本类的某个方法
this() // 表示调用本类构造方法
super 表示父类对象,是指向父类的引用。
super.属性 // 表示父类对象中的成员变量
super.方法() // 表示父类对象中定义的方法
super() // 表示调用父类构造方法
构造方法
构造方法是一种特殊的方法,它是一个与类同名的方法。在继承中构造方法是一种比较特殊的方法(比如不能继承),所以要了解和学习在继承中构造方法的规则和要求。
继承中的构造方法有以下几点需要注意:
父类的构造方法不能被继承:
因为构造方法语法是与类同名,而继承则不更改方法名,如果子类继承父类的构造方法,那明显与构造方法的语法冲突了。比如 Father 类的构造方法名为 Father(),Son 类如果继承 Father 类的构造方法 Father(),那就和构造方法定义:构造方法与类同名冲突了,所以在子类中不能继承父类的构造方法,但子类会调用父类的构造方法。
子类的构造过程必须调用其父类的构造方法:
Java 虚拟机**构造子类对象前会先构造父类对象,父类对象构造完成之后再来构造子类特有的属性,*这被称为*内存叠加。而 Java 虚拟机构造父类对象会执行父类的构造方法,所以子类构造方法必须调用 super()即父类的构造方法。就比如一个简单的继承案例应该这么写:
class A{
public String name;
public A() {//无参构造
}
public A (String name){//有参构造
}
}
class B extends A{
public B() {//无参构造
super();
}
public B(String name) {//有参构造
//super();
super(name);
}
}
如果子类的构造方法中没有显示地调用父类构造方法,则系统默认调用父类无参数的构造方法。