Java学习 第四章 java面向对象(二)
一、封装性
1、封装性产生目的
保护某些属性和方法不被外部所看见。
2、封装性的实现
为属性和方法进行封装是通过关键字private声明的;
实现该属性的set和get方法,为外部所访问;
eg: Person类
private String name;
public void getName(String name){
return name;//得到
}
public void setName(String name){
this.name = name;//设置
}
创建get和set方法的快捷键:鼠标右键->Source->Generate Getters and Setters... 选中属性点击OK,如下图:
3、匿名对象
匿名对象就是没有名字的对象,如果程序中只是用一次该对象,就可以使用匿名对象的方式。
eg: 创建一个Person类,并使用此类:
//匿名对象 new per.tell() 只使用一次
//正常情况 Person per = new Person(); per.tell();
4、构造方法
(1)格式:访问修饰符 类名称(){
程序语句
}
(2)注意:构造方法名称必须与类名一致;构造方法没有返回值;构造方法可以有参数;构造方法可以重载;
eg:class People{//实例化类的时候会自动执行构造函数
// 构造方法
public People(){
System.out.println("hello");
}
}
(3)构造方法主要是为类中的属性初始化;
(4)每个类在实例化之后都会调用构造方法,如果没有构造方法,程序在编译的时候会创建一个无参数的什么都不做的构造方法。
二、Java面向对象基本特征:继承
1、继承的基本概念:扩展父类的功能;
2、Java中使用extends关键字完成继承
class 子类 extends 父类{ }
3、在java中只允许单继承,不能继承多个,可以多层继承;
4、子类不能直接访问负累的私有成员;
5、子类对象的实例化
在子类对象实例化之前,必须先调用父类中的构造方法,之后调用子类构造方法
6、方法的重写
在继承中,也存在着重写的概念,其实就是子类定义了和父类同名的方法;
定义: 方法名称相同,返回值类型相同,参数也同。
可使用super关键字,实现父类的方法;
eg:
重写限制:
被子类重写的方法拥有比父类方法更加严格的访问权限
访问权限:
private(作用域:当前类) < default(作用域:同一包) < public(作用域:整个项目)
7、super关键字:
强行调用父类方法的执行
super不一定在重写中使用,也可以表示那些方法是从父类中继承而来的。
8、java重写与重载的区别
三、Java面向对象-多态性
1、多态性的体现:
方法的重载和重写;
对象的多态性;
2、对象的多态性:
向上转型:程序会自动完成;父类 父类对象 = 子类实例
eg:类B继承类A: B b = new B(); A a = b;
向下转型:强制类型转换;子类 子类对象 = (子类)父类实例
eg:类B继承类A:A a = new B(); B b = (B)a;
3、instanceof关键字
在Java中可以使用instanceof关键字判断一个对象到底是不是一个类的实例。
instanceof 返回Bool值
eg: A a = new A();
System.out.println(a instanceof A); true
System.out.println(a instanceof B); flase
四、Java面向对象中引用的传递
1、引用传递
范例:
class Person{
int age = 10;
}
public class Demo{
public static void main(String args[]){
Person p = new Person();
p.age = 20;
System.out.println(p.age);//结果为20;
tell(p);
System.out.println(p.age);//结果为30;
}
public static void tell(Person p2){
p2.age = 30;
}
}
内存示例图:r1改动指向
范例2:
public static void main(String args[]){
String str1 = "hello"
System.out.println(str1);//结果为hello;
tell(str1);
System.out.println(str1);//结果为hello;
}
public static void tell(String str2){
str2 = "jike";
}
String类型不可改变属性,内存示意图:
五、java面向对象-抽象类与接口
1、final关键字在java中被称为完结器,表示最终的意思。
2、final能声明类、方法、属性:
使用final声明的类不能被继承;
使用final声明的方法不能被重写;
使用final声明的变量变成常量,常量是不可以被修改的;
通过final声明的属性名字大写,例如 final String NAME = "xx";
3、抽象类概念:包含一个抽象方法的类就是抽象类;
抽象方法:声明而未被实现的方法,抽象方法必须使用abstract关键字声明;
抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中俄的所有抽象方法;
定义格式:
abstract class className{
属性
方法
抽象方法
}
抽象类不能直接实例化,要通过其子类进行实例化;
eg:
abstract class Abs{
private int age;
public void tell(){
}
public abstract void say();
}
class AbsDemo extends Abs{
public void say(){
}
}
AbsDemo a = new AbsDemo();
4、接口
接口是java中最重要的概念,接口可以理解为一种特殊的类,里面全部是由全局变量和公共的抽象方法所组成
接口的格式
interface interfaceName{
全局常量
抽象方法
}
接口的实现也是必须通过子类,使用关键字implements,而且接口是可以多实现的;
一个类可以同时继承抽象类和实现接口;eg class A extends xx implements xx(){}.
一个接口不能继承一个抽象类,但是却可以通过extends关键字同时继承多个接口,实现接口的多继承;
eg: interface Inter{
public static final int AGE = 100;
public abstract void tell(); //public abstract 可省略
}
class A implement void Inter{
public void tell(){
}
}
interface Inter3 extends Inter1,Inter2(){}
A a = new A();
a.tell();
System.out.println(Inter.AGE);
六、Java面向对象之泛型
1、认识泛型
泛型是在JDK1.5以后增加的新功能。泛型(Generic)
泛型可以解决数据类型的安全问题,他主要的原理是在声明的时候通过一个标识表示类中某个属性的类型活着是某个方法的返回值及参数类型。
格式:
访问权限 class 类名称<泛型,泛型...>{
属性
方法
}
对象的创建
类名称<具体类型> 对象名称 = new 类名称<具体类型>();
eg:
class Point<T>{
private T x;
public T getX(){
reutrn x;
}
public T setX(T x){
this.x = x;
}
}
Point<String> p = new Point<String>();
p.setX("经度为:100");
2、构造方法使用泛型
构造方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造方法设置属性内容的时候,那么构造方法的定义与之前并无不同,不需要像类声明那样制定泛型。
eg: class Con<T>{
private T value;
public Con(T value){
this.value = value;
}
public T getValue(){
return value;
}
public T setValue(T value){
this.value = value;
}
}
Con<String> c = new Con<String>("构造方法中使用泛型");
3、指定多个泛型,设置多个泛型直接在<>中添加多个泛型就可以了,中间用逗号隔开。例如<K,T>
4、通配符 :? (不论什么类型都可以使用)
5、泛型接口
在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型的语法类似,也是在接口名称后面加上<T>
格式: interface 接口名称<泛型标识>{}
6、泛型方法
泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据类型。
格式:访问权限 <泛型标识> 泛型标识 方法名称([泛型标识 参数名称])
eg:
public <T>T tell(T t){
return t;
}
7、泛型数组
泛型数组和泛型方法搭配使用;
在使用泛型方法的时候,也可以传递或返回一个泛型数组;
eg:
public static <T>void tell(T arr[]){
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
调用:
Integer arr[] = {1,2,3,4};
tell(arr);
参考:极客学院课程 http://ke.jikexueyuan.com/zhiye/javaweb/