在理解面向对象的重要属性之前,我们先理解一下一些关键字:
1.static:静态
在定义好的静态方法中,不能访问非静态的成员属性和方法,但是在非静态的成员方法中,可以访问静态的成员属性和方法
2.final:
被final关键字修饰的类无法被继承、成员属性无法被修改、成员方法无法被重写
使用final关键字修饰的是局部变量是基本的数据类型(存放在堆空间)定义好后,该变量的值是无法被修改的
但是如果我们使用final关键字修饰的类型是引用类型的话(采用栈空间+堆空间的方式存储)我们的final相当于是修饰了栈空间的变量,但是堆空间中的值是还可以被修改的
我们通常使用final static int SAX =6;来定义一个常量值
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
例如,我们定义一个final int 【】 arr = new int【3】;仍然可以使用arr【0】 = 10;但是不能在将arr指向别的堆内存地址
封装就是将我们的类给封锁起来,隐藏对象内部的真实性
首先需要将对象属性私有化,,目的是是我们的成员属性不能被随意修改
设置get和set方法---来设置和获得参数
public int get(){return this.x} ;public void set(int x){this.x = x};
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Object类是所有类的父类;;;
可以是子类具有父类的属性和方法,还可以在子类中定义新的成员属性和方法
在父类中使用private关键字修饰的成员方法是不能被子类继承的
public class class1 extends class2{}
我们知道,我们在new一个对象时,会首先调用它的构造方法,如果我们使用子类的构造方法,则需要先调用父类的构造方法,如果我们不自定义构造方法,那么先就会自动调用父类无参的构造方法
如果我们在父类的基础上,又定义了一个成员属性,则在新的构造方法中只需要使用super关键字给父类传递我们父类有的成员方法的值;;
Call to'super() 'must be first statement in constructor body
在子类方法中访问一个局部变量:先在当前方法中查找该局部变量;在当前类中查找局部变量;最后在父类中查找该局部变量
Java只能支持单继承,不能支持多继承,所以一个类是不能有多个父类的
继承模式的缺点:继承使得类与类之间变得高度耦合,当父类发生改变时,子类也必须跟着改变;
PLUS:对于继承,我们可以这样理解,父类相当于父亲,子类相当于孩子,一个父亲可以有多个孩子,而一个孩子只能一个父亲,一个孩子还可以有自己的孩子;当创建一个孩子是,必须先创建一个父亲,所以子类构造方法会首先调用父类的构造方法
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
多态就是子类继承父类之后展示出来的不同形态
1.由继承或者实现关系 继承extends 类和类 ;实现implements 类和接口;
2.方法重写--子类重写父类的方法(函数重写与函数重载在前面有提到)
3.有父类引用指向子类对象
成员变量和方法的访问,执行看右边,编译看左边,具体解释是什么意思呢?
也就是说,我们可以使用父类的引用接受子类的对象,即用父类在栈空间中的地址来接受堆空间中的地址
但是在执行时是使用右边的成员方法和属性,这地方注意,父类的引用是不能调用子类新定义的成员函数的
优点:提高了程序的扩展性,由于父类的引用指向了子类的对象,所以定义好一个弗列的引用之后就可以向他传递不同的子类对象来执行不同子类中重写的父类的方法
缺点:由于编译看左边,执行看右边的特点,导致如果子类中自己心定义了一个成员方法,那么父类的引用无法调用该方法
instanceof关键字的作用?
就是用来判断是不是同一支下,什么意思呢?就是说是否属于界门纲目科属种一条链上的
1.由子到父:向上转型 Parent parent =new son();
2.由父到子:向下转型 可能发生类型转换报错 将父类的引用强转为子类的引用然后赋值个子类的引用
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在Java中,没有方法体的方法必须被定义为抽象方法,而有抽象方法的类必须被定义为抽象类
public abstract class 类名{ public abstract void 函数名() ; }
1.抽象类的子类必须重写父类中的抽象方法,如果不重写那么该子类也应该为抽象类
2.抽象类中可以定义非抽象的方法
3.抽象类是不可以被实例化的
4.抽象类的构造方法与普通的一致
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接口与抽象类类似,是不能被实例化的,并且由于接口中的方法都是抽象方法,所以接口中的方法是必须被实例化的,否则实现类必须被定义为抽象类;
接口定义的基本方式:public interface 接口名称{}
需要注意的是,接口中的方法都默认的加上了,public static final关键字来修饰
在访问时,可以通过”接口名称.接口名“或者是”完整路径.接口名“访问
问题一:这里我们提到一个问题?接口中的所有方法都是抽象方法(没有方法体),且默认被public static final关键字修饰,那我们能够自定义非抽象方法吗?
可以。在jdk8之后可以 定义格式为public default void 方法名(){}
问题二:我们在提到一个问题,接口中是否有构造方法呢?
这里我们给出答案,接口中是没有构造方法的,而抽象类中是有我们的构造方法的。
当我们使用 public class CLASS1 implements INTERFACE1{}时,若没有构造方法,那么会自动调用我们公用父类Object类中的构造方法
1.类和类的继承关系:继承关系,只能单继承,但是可以多层继承 一个类只能直接继承一个父类 2.类和接口的实现关系:可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口 一个类可以实现多个不同的接口 3.接口和接口继承的关系:可以单继承也可以多继承
1.成员区别:在接口类中可以定义常量,变量和构造方法,但是在接口中只能定义常量方法
2.设计区别:抽象类是对类抽象,主要包括属性和行为(对事物的抽象),而接口主要是对行为的抽象
综上所述,接口的功能实际上就是对于抽象类的一个功能扩充,可以扩充该抽象条件下某几个特例的功能而不影响整个抽象类。。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
内部类:在类中再次声明一个类例如
public class A{public class B{}} B就是内部类 类A就成为外部类
内部类的访问特点:内部类可以直接访问外部类的成员,包括私有的,外部类要访问内部类的成员,必须创建对象
*内部类的分类:1.成员内部类(成员内部类)
2.方法内布类(局部内部类)
3.静态内部类(成员内部类)
4.匿名内部类(局部内部类)
*如果类定义在方法里面,该类就是方法内部类
如果类定义在方法外面,该类就是成员内布类,如果该类加上了static修饰 那么就是静态内部类
成员内部类::在外界访问内部类时,以上面例子为例,,A.B a =new A().new B();
在一般的企业开发中,在外界无法访问内部类;;;;;;;;;;;;;;;;;;;;;;;;;将内部类加以private修饰
静态内部类::在静态内部类中访问外部类中的成员必须时静态的 ,不然不可以访问。。。在外界如果想要访问静态内布类 使用语句 A.B a= new A().B()
局部内部类::方法内部类::在方法内定义的类,类似于方法内的局部变量,只能在该方法里面使用,不能再该方法外面访问,可以直接访问外部类的成员,包括私有的
★★★★★★★★★★★★★★★★★★★★★★★★匿名内部类::可以new接口(实现类)或者是抽象类★★★★★★★★★★★★★★★★★★★★★★★★
使用匿名内部类,就不需要创建 实现类 和子类
直接通过new 内部类的形式 简化不需要的创建 (实现类和子类)之后非常常用
详解:我们知道,接口是不能被实例化的,假设此时我们定义了一个接口,那么想要使用接口中的方法,就需要创建实现类;;
但是我们如果直接使用匿名内部类,就可以直接在内部使用接口中的方法,非常方便;;
案例:假设有一个接口为A ,其中有一个抽象方法show(),在主函数中我们可以直接使用 A a = new A(){@override public void show(){sout("sss"}};