- [1 类和对象](https://cloud.tencent.com/developer)
- [1.1 类成员](https://cloud.tencent.com/developer)
- [1.2 类的创建和使用](https://cloud.tencent.com/developer)
- [1.3 权限修饰符](https://cloud.tencent.com/developer)
- [1.4 小知识](https://cloud.tencent.com/developer)
- [2 面向对象三大特征](https://cloud.tencent.com/developer)
- [2.1 封装 (Encapsulation)](https://cloud.tencent.com/developer)
- [2.2 继承 (Inheritance)](https://cloud.tencent.com/developer)
- [2.2.1 定义](https://cloud.tencent.com/developer)
- [2.2.2 作用](https://cloud.tencent.com/developer)
- [2.2.3 注意](https://cloud.tencent.com/developer)
- [2.2.4 方法的重写(override)](https://cloud.tencent.com/developer)
- [2.3 多态 (Polymorphism)](https://cloud.tencent.com/developer)
- [3 其他关键字](https://cloud.tencent.com/developer)
- [this](https://cloud.tencent.com/developer)
- [super](https://cloud.tencent.com/developer)
- [package](https://cloud.tencent.com/developer)
- [import](https://cloud.tencent.com/developer)
- [static](https://cloud.tencent.com/developer)
- [类变量(class Variable)](https://cloud.tencent.com/developer)
- [类方法(class Method)](https://cloud.tencent.com/developer)
- [final](https://cloud.tencent.com/developer)
- [4 Object类](https://cloud.tencent.com/developer)
- [4.1 主要方法](https://cloud.tencent.com/developer)
- [5 包装类(Wrapper)](https://cloud.tencent.com/developer)
- [5.1 装箱](https://cloud.tencent.com/developer)
- [5.2 拆箱](https://cloud.tencent.com/developer)
- [5.3 字符串和基本数据类型之间的转换](https://cloud.tencent.com/developer)
- [6 抽象类 (abstract class)](https://cloud.tencent.com/developer)
- [7 接口 (interface)](https://cloud.tencent.com/developer)
面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,将功能封装进对象,强调具备了功能的对象。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
类(class)和对象(object)是面向对象的核心概念。
类是对一类事物描述,是抽象的、概念上的定义。
对象是实际存在的某类事物的某个个体,因而也称实例(instance)。
定义内部类:
class Person{
// 成员内部类 (非static的)
class Bird{}
//成员内部类 (静态内部类)
static class Dog{}
}
创建内部类的对象:
//创建静态内部类的对象:可以直接通过外部类调用静态内部类的构造器
Person.Dog d = new Person.Dog();
//创建非静态的内部类的对象:必须先创建外部类的对象,通过外部类的对象调用内部类的构造器
Person p = new Person();
Person.Bird b = p.new Bird();
区分内部类、外部类的变量:
public class A{
private int s = 111;
public class B {
private int s = 222;
public void mb(int s) {
System.out.println(s); // 局部变量s
System.out.println(this.s); // 内部类对象的属性s
System.out.println(A.this.s); // 外层类对象属性s
}
}
}
public class TestOOP {
public static void main(String[] args) {
// 2. 创建类的实例(对象)
Animal nAnimal = new Animal("猴子", 1);
// 调用类的属性或方法
nAnimal.eat();
System.out.println(nAnimal.getName());
}
}
// 1. 设计并定义类
class Animal{
// 属性
private String name;
public int age;
// 构造器
public Animal() {}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
// 方法
public void eat() {
System.out.println(name + "进食");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
// 代码块
{
System.out.println("??");
}
}
public、protected、private置于类的成员定义前,用来限定对象对该类成员的访问权限。
修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
private | Yes | | | |
(缺省) | Yes | Yes | | |
protected | Yes | Yes | Yes | |
public | Yes | Yes | Yes | Yes |
总结:
对于class的权限修饰只可以用public和default(缺省)。
成员变量有默认初始化值,局部变量没有,必须显式初始化。
方法的重载 (overload) 方法名相同,参数类型不同(个数,类型,顺序)
可变个数形参 (jdk5.0之后)
public class Person {
public String name;
public int age;
public Date birthDate;
public String getInfo() {...}
}
public class Student extends Person{
public String school;
}
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
此处的多个类称为子类,单独的这个类称为父类(基类或超类)。可以理解为:“子类 is a 父类”。语法:
class Subclass extends Superclass{ }
在子类中可以根据需要对从父类中继承来的方法进行改造。
在程序执行时,子类的方法将覆盖父类的方法。
package mytest;
public class A{
private void privateFunc() {
System.out.println("A privateFunc");
}
void defaultFunc() {
System.out.println("A defaultFunc");
}
protected void protectedFunc() {
System.out.println("A protectedFunc");
}
public void publicFunc() {
System.out.println("A publicFunc");
}
}
package mytest;
public class B extends A{
// 不是重写,而是定义了另外一个函数,重写的前提是有访问权限
private void privateFunc() {
System.out.println("B privateFunc");
}
// 重写
void defaultFunc() {
System.out.println("B defaultFunc");
}
// 重写
protected void protectedFunc() {
System.out.println("B protectedFunc");
}
// 重写
public void publicFunc() {
System.out.println("B publicFunc");
}
}
package mytest;
public class Test {
public static void main(String[] args) {
A a = new B();
B b = new B();
// a.privateFunc(); // 只能在类内部调用
a.defaultFunc();
a.protectedFunc();
a.publicFunc();
// b.privateFunc(); // 只能在类内部调用
b.defaultFunc();
b.protectedFunc();
b.publicFunc();
}
}
输出:
B defaultFunc
B protectedFunc
B publicFunc
B defaultFunc
B protectedFunc
B publicFunc
体现:
Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
若编译时类型和运行时类型不一致,就出现多态.
子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型(upcasting)。
一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。
// B继承A
A a = new B(); // 向上转型
a.defaultFunc(); // 虚拟方法调用(Virtual Method Invocation)
//a.bfunc(); // 无法调用子类中添加的方法
((B)a).bFunc(); // 强制类型转换(向下转型)
它在方法内部使用,表示这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象的引用。
可以调用属性、方法、构造器(构造器相互调用,使用this()必须放在构造器的首行)。
super可用于访问父类中定义的属性、成员方法,在子类构造方法中调用父类的构造器。
注意:
包帮助管理大型软件系统:将语义近似的类组织到包中;解决类命名冲突的问题。
package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。
格式为:
package 顶层包名.子包名
import 包名[.子包名…]. <类名 |*>
修饰属性(类变量)、方法(类方法)、初始化块(代码块)、内部类。
被修饰后的成员具备以下特点:
类变量存在于静态域中。
static方法即使被重写,也不能通过父类的指针(多态)访问到子类重写的static方法。
A a1 = new B();
a1.staticFunc(); // A staticFunc
((B)a1).staticFunc(); // B staticFunc
修饰类、属性和方法。
注意:final修饰对象时,其引用不能改变,但对象内部的属性若没有用final修饰,则可以被修改。
public Object()构造方法
public boolean equals(Object obj) 比较是否指向同一个对象。对类File、String、Date及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象,因为在这些类中重写了Object类的equals()方法。 与“==”区别: 字符串常量池:
public int hashCode()
public String toString() 像String类、包装类、File类、Date类等,已经实现了Object类中toString()方法的重写。
针对八种基本定义相应的引用类型—包装类(封装类)
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
基本数据类型包装成包装类的实例。
通过包装类的构造器实现
还可以通过字符串参数构造包装类对象
获得包装类对象中包装的基本类型变量。
调用包装类的.xxxValue()方法
Boolean boolean1 = true;
boolean b = boolean1.booleanValue();
字符串转换成基本数据类型
基本数据类型转换成字符串
JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配。
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
用abstract关键字来修饰一个类时,这个类叫做。
用abstract来修饰一个方法时,该方法叫做。 抽象方法:只有方法的声明,没有方法的实现。以分号结束:
含有抽象方法的类必须被声明为抽象类。(即抽象类中才有的抽象方法)
抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。
不能用abstract修饰属性、构造器、私有方法、静态方法、final的方法。
总结:abstract修饰的方法必须能够被子类重写。
有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
接口(interface)是抽象方法和常量值的定义的集合。
class SubClass implements InterfaceA{ }
public interface Runner {
int ID = 1;
void start();
public void run();
void stop();
}
实现接口的匿名类对象:
Runner r = new Runner(){
// 实现接口的所有方法
}
总结:接口可以看做一种特殊的抽象类,所有属性为公开静态常量,所有方法都为公开抽象方法。接口之间可以多继承,类可以实现多个接口。
如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限。
在开发中,一个类不要去继承一个已经实现好的类,要么继承抽象类,要么实现接口。
注:以上笔记参考自尚硅谷
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有