1.创建对象时,代码的执行顺序
[1]初始化父类属性,调用语句块,调用父类的构造
[2]初始化子类属性,调用语句块,调用子类的构造
如果父类构造被重载,需要子类来确定具体调用父类中的哪个构造。
byte Btye
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Charactor
自动装箱
Integer ii = 100;
自动拆箱
int i = new Integer(100);
3.Object类中的方法
[1]toString() 打印输出对象名时调用。可以被子类重写。
[2]equal() 定义对象相等的含义
[3]finalize() 在垃圾回收其回收当前生成的对象时调用,用来做清理工作,例如关闭流等。
[1]static修饰变量
[2]static修饰方法
[3]static修饰语句块--------在第一次创建对象时调用
[4]static修饰类------------几乎不用,先不管
静态内容在字节码文件载入JVM时,被初始化
静态内容通过类名调用
final修饰变量,表示常量
final修饰方法,表示该方法不能被重写
final修饰类,表示该类不能被继承
6.抽象类
[1]abstract修饰类,为抽象类
不能创建对象
[2]abstract修饰方法,为抽象方法
没有方法体,被子类实现
[3]如果子类继承一个抽象类,要么实现抽象类中的所有抽象方法,
要么将子类定义为抽象类
[1]定义格式:
interface 接口名
{
静态常量
抽象方法
}
[2]类可以实现(implements)多个接口
[3]接口之间可以多继承
[1]封装
封装意味着把对象的属性和方法结合成一个独立的系统单位,
并尽可能隐藏对象的内部细节。
[2]抽象
抽象的过程是对具体问题进行概括的过程,
是对一类公共问题进行统一描述的过程
[3]继承
子类对象拥有其父类相同的全部属性和方法。
[4]多态
多态时指在父类中定义的属性和行为被子类继承后,可以具有不同的数据类型或者表现行为等特征
9.多态
[1]多态的体现
方法的重载------编译时多态
在Out类中创建内部类对象 Inner in = new Inner();
在Out类外创建内部类对象 Out.Inner in = new Out().new Inner();
11.匿名内部类
匿名内部类没有名字,所以在定义的时候就开始使用,并且只能通过该类创建一次对象
内部类使用原则:内部类都当前的外部内使用。
[1]初始化父类属性,调用语句块,调用父类的构造
[2]初始化子类属性,调用语句块,调用子类的构造
如果父类构造被重载,需要子类来确定具体调用父类中的哪个构造。
package com;
public class Book {
protected String name;
protected int price;
{
System.out.println("初始化块,载入资源或者是第三方动态库");
}
public Book() {
// TODO Auto-generated constructor stub
System.out.println("调用不带参的Book构造方法");
}
public Book(String name, int price) {
// TODO Auto-generated constructor stub
this.name = name;
this.price = price;
}
public void printInfo()
{
System.out.println(name + ":" + price);
}
}
package com;
public class ComputerBook extends Book {
public ComputerBook() {
// TODO Auto-generated constructor stub
System.out.println("调用ComputerBook构造方法");
}
}
package com;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
ComputerBook cb = new ComputerBook();
}
}
2.封装类
byte Btye
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Charactor
package com;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//在栈区分配内存
int i = 10;
//在堆上分配内存
Integer ii = new Integer(10);
//可以将一个含有数字的字符串转化为int型
int number = ii.parseInt("123");
System.out.println(++number);
Integer i_01 = new Integer(100);
Integer i_02 = new Integer(100);
//比地址
System.out.println(i_01 == i_02);
int ii_01 = 10;
int ii_02 = 10;
//比值
System.out.println(ii_01 == ii_02);
//自动装箱
//Integer i_03 = new Integer(100); <==> Integer i_03 = 100;
Integer i_03 = 100;
//自动拆箱
//int i_04 = new Integer(100); <==> int i_04 = 100;
int i_04 = new Integer(100);
}
}
自动装箱
Integer ii = 100;
自动拆箱
int i = new Integer(100);
3.Object类中的方法
[1]toString() 打印输出对象名时调用。可以被子类重写。
[2]equal() 定义对象相等的含义
[3]finalize() 在垃圾回收其回收当前生成的对象时调用,用来做清理工作,例如关闭流等。
package com;
//Alt + ? 提示出当前类所拥有的属性和方法
public class Book {
private String name;
private int price;
public Book() {
// TODO Auto-generated constructor stub
name = "think in java";
price = 100;
}
public Book(String name, int price) {
// TODO Auto-generated constructor stub
this.name = name;
this.price = price;
}
// @Override
// public String toString() {
// // TODO Auto-generated method stub
// return name + ":" + price;
// }
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
System.out.println("obj = " + obj);
System.out.println("this = " + this);
Book book = (Book)obj;
return this.name.equals(book.name) && this.price == book.price;
}
}
package com;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//toString()----------Object
Book book = new Book();
//打印输出对象名,是系统调用toString()方法
System.out.println(book);
String s = book.toString();
System.out.println(s);
String s_01 = new String("abc");
String s_02 = new String("abc");
//equal()---------------Object
//比地址
System.out.println(s_01 == s_02);
//比内容
System.out.println(s_01.equals(s_02));
Book b_01 = new Book("book01", 100);
Book b_02 = new Book("book01", 100);
System.out.println(b_01.equals(b_02));
System.out.println("b_02 = " + b_02);
System.out.println("b_01 = " + b_01);
}
}
4.static(静态)
[1]static修饰变量
[2]static修饰方法
[3]static修饰语句块--------在第一次创建对象时调用
[4]static修饰类------------几乎不用,先不管
静态内容在字节码文件载入JVM时,被初始化
静态内容通过类名调用
package com;
public class Book {
//在类文件载入虚拟机时,系统对静态数据分配内存空间
public static int number;
private String name;
private int price;
static {
System.out.println("执行静态语句块");
}
public Book() {
// TODO Auto-generated constructor stub
number++;
}
//最终方法,不能被重写
public final void printInfo()
{
System.out.println(name);
}
}
package com;
public class ComputerBook extends Book {
}
package com;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//统计用户创建了多少本书?
System.out.println(Book.number);
Book book_01 = new Book();
Book book_02 = new Book();
Book book_03 = new Book();
Book book_04 = new Book();
Book book_05 = new Book();
System.out.println(Book.number);
//静态方法
Math.random();
}
}
5.final(最终)
final修饰变量,表示常量
final修饰方法,表示该方法不能被重写
final修饰类,表示该类不能被继承
6.抽象类
[1]abstract修饰类,为抽象类
不能创建对象
[2]abstract修饰方法,为抽象方法
没有方法体,被子类实现
[3]如果子类继承一个抽象类,要么实现抽象类中的所有抽象方法,
要么将子类定义为抽象类
[4]包含抽象方法的类一定是抽象类。抽象类不一定包含抽象方法。
package com;
//包含抽象方法的类必须定义为抽象类
//抽象类不一定包含抽象方法
public abstract class Shape {
protected int a;
protected int b;
public Shape(int a, int b) {
// TODO Auto-generated constructor stub
this.a = a;
this.b = b;
}
//抽象方法:没有方法体
public abstract int getArea();
}
package com;
public class Circle extends Shape {
public Circle(int a, int b) {
super(a, b);
// TODO Auto-generated constructor stub
}
@Override
public int getArea() {
// TODO Auto-generated method stub
return (int)(Math.PI*a*a);
}
}
package com;
//子类继承抽象类,需要实现抽象类的抽象方法
//如果子类没有实现父类中所有的抽象方法,那么子类需要定义为抽象类
public class Rect extends Shape{
public Rect(int a, int b) {
super(a, b);
// TODO Auto-generated constructor stub
}
@Override
public int getArea() {
// TODO Auto-generated method stub
return a*b;
}
}
package com;
public class Thriangle extends Shape {
public Thriangle(int a, int b) {
super(a, b);
// TODO Auto-generated constructor stub
}
@Override
public int getArea() {
// TODO Auto-generated method stub
return (int)(Math.sin(Math.PI/3)*a*a/2);
}
}
package com;
public class TRect extends Shape {
private int h;
public TRect(int a, int b, int h) {
super(a, b);
this.h = h;
// TODO Auto-generated constructor stub
}
@Override
public int getArea() {
// TODO Auto-generated method stub
return (a+b)*h/2;
}
}
package com;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//抽象类不能创建对象
// Shape shape = new Shape();
// shape.getArea();
//打印输出所有边为10的形状的面积
Circle c = new Circle(10, 10);
Rect r = new Rect(10, 10);
TRect tr = new TRect(10, 10, 10);
Thriangle tg = new Thriangle(10, 10);
c.getArea();
r.getArea();
tr.getArea();
tg.getArea();
//for
Shape s_01 = new Circle(10, 10);
Shape shapes[] = {new Circle(10, 10), new Rect(10, 10),
new TRect(10, 10, 10), new Thriangle(10, 10)};
for (int i = 0; i < shapes.length; i++) {
shapes[i].getArea();
}
}
}
7.接口
[1]定义格式:
interface 接口名
{
静态常量
抽象方法
}
[2]类可以实现(implements)多个接口
[3]接口之间可以多继承
package ppt;
public interface InterUSB {
public void startWork();
public void endWork();
}
package ppt;
public class Kindle implements InterUSB {
@Override
public void startWork() {
// TODO Auto-generated method stub
System.out.println("连接usb,打开电子书");
}
@Override
public void endWork() {
// TODO Auto-generated method stub
System.out.println("断开usb, 关闭电子书");
<span style="white-space:pre"> </span>}
}
package ppt;
public class Moble implements InterUSB {
@Override
public void startWork() {
// TODO Auto-generated method stub
System.out.println("手机连接上USB");
}
@Override
public void endWork() {
// TODO Auto-generated method stub
System.out.println("手机断开连接");
}
}
package ppt;
public class Printer implements InterUSB {
@Override
public void startWork() {
// TODO Auto-generated method stub
System.out.println("打印机开始工作");
}
@Override
public void endWork() {
// TODO Auto-generated method stub
System.out.println("打印机结束工作");
<span style="white-space:pre"> </span>}
}
package ppt;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//启动设备Printer,Moble,Kindle,开始工作
//工作中
//关闭设备,停止工作
Kindle read = new Kindle();
read.startWork();
Moble phone = new Moble();
phone.startWork();
Printer penter = new Printer();
penter.startWork();
read.endWork();
phone.endWork();
penter.endWork();
}
}
8.面向对象的特征
[1]封装
封装意味着把对象的属性和方法结合成一个独立的系统单位,
并尽可能隐藏对象的内部细节。
[2]抽象
抽象的过程是对具体问题进行概括的过程,
是对一类公共问题进行统一描述的过程
[3]继承
子类对象拥有其父类相同的全部属性和方法。
[4]多态
多态时指在父类中定义的属性和行为被子类继承后,可以具有不同的数据类型或者表现行为等特征
9.多态
[1]多态的体现
方法的重载------编译时多态
方法的重写------运行时多态
[2]对象的多态性
向上转型:程序自动完成--------(上溯造型)
父类 父类的引用 = 子类对象
向下转型: --------(下溯造型)
子类 子类的引用 = (子类)父类的引用
[3]instanceof类型检测运算符
在造型前使用instanceof运算符测试对象的类型
[4]多态的好处
以多态的形式传递参数,增强了参数类型的灵活性。
[5]引用数据类型的转换一定发生在父子类之间
父子关系:
1.子类 extends 父类
2.类 implements 接口 ---------类是接口的子类,接口是类的父类
package com;
public class Moble {
public void printfInfo()
{
System.out.println("这是一台手机");
}
}
package com;
public class CellMoble extends Moble {
@Override
public void printfInfo() {
// TODO Auto-generated method stub
System.out.println("这是一部生物手机");
}
}
package com;
public class SmartMoble extends Moble{
@Override
public void printfInfo() {
// TODO Auto-generated method stub
System.out.println("这是一台智能手机");
}
public void buy()
{
System.out.println("买一部智能手机");
}
}
package com;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Moble moble = new SmartMoble();
moble.printfInfo();
//基本数据类型的转换
int i = (int)2.0;
//引用数据类型的转换
//父类型强制转换为子类型
//将父类型引用(moble)强制转换为子类型引用(smartMoble)
System.out.println(moble);
SmartMoble smartMoble = (SmartMoble)moble;
System.out.println(smartMoble);
smartMoble.buy();
Moble moble02 = new CellMoble();
//类型转换错误
SmartMoble smartMoble02 = (SmartMoble)moble02;
smartMoble02.printfInfo();
}
}
10.内部类
定义在一个类里面的类。
格式:
class Out
{
<span style="white-space:pre"> </span>class Inner()
<span style="white-space:pre"> </span>{
}
}
在Out类中创建内部类对象 Inner in = new Inner();
在Out类外创建内部类对象 Out.Inner in = new Out().new Inner();
11.匿名内部类
匿名内部类没有名字,所以在定义的时候就开始使用,并且只能通过该类创建一次对象
内部类使用原则:内部类都当前的外部内使用。
package com;
//外部类
//在Android中会大量的使用内部类
public class Student {
String name;
int score;
BirthDay birthday;
// 使用接口制作匿名内部类并且创建对象
Inter01 inter = new Inter01() {
public void fun01() {
// TODO Auto-generated method stub
System.out.println("fun01");
}
};
public Student(int year, int month, int day) {
// TODO Auto-generated constructor stub
// 创建内部类对象
birthday = new BirthDay(year, month, day);
// 匿名内部类
// 定义一个子类继承BirthDay,改写了printBirth方法。
// 子类没有名字
// 定义好子类后,立即使用子类创建对象
BirthDay bd = new BirthDay() {
@Override
public void printBirth() {
// TODO Auto-generated method stub
System.out.println("my_birthday");
}
};
bd.printBirth();
}
// 内部类
interface Inter01 {
public void fun01();
}
// 内部类:定义在类里面的。
// 所有的访问控制修饰符都可以修饰内部类
class BirthDay {
int year;
int month;
int day;
public BirthDay(int year, int month, int day) {
// TODO Auto-generated constructor stub
this.year = year;
this.month = month;
this.day = day;
}
public BirthDay() {
// TODO Auto-generated constructor stub
}
public void printBirth() {
System.out.println("birthday");
}
}
}
package com;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student(1990, 4, 4);
s.inter.fun01();
//在外面创建内部类对象
Student.BirthDay in = new Student(1990, 4, 4).new BirthDay();
}
}