所谓面向对象是一种编程思想,通过这种思想可以吧生活中的复杂事情变的简单化,从原来的执行者变成指挥者,面向对象是基于面向过程而言的,面对对象强调结果,比如你要去上学,强调的是去学校,这个动作就是面向对象,而面向过程强调过程,强调的是你去学校的过程,比如骑自行车骑啊骑啊的去。
public class Test1 {
public static void main(String[] args) {
//p是引用对象,持有了对于Person对象的地址值的引用
//此时的p,含有属性,但都是默认值
Person p = new Person();
//设置属性值
p.name="lisi";
p.age=20;
//调用方法
p.eat();
p.sleep();
}
}
class Person{
//属性--成员变量
String name;
int age;
//行为--方法
void eat(){
System.out.println("吃饭饭");
}
void sleep(){
System.out.println("睡觉觉");
}
}
java内存分为5大块,推,虚拟机栈,本地方法栈,方法区,程序计数器,我们基础阶段主要学习栈,推
封装是指隐藏对象的属性和实现细节,由private关键字修饰,当一个类的属性或者方法不想让其他类访问时,可以用private修饰,仅仅对外提供公共的访问方式。由set(),get()方法提供,封装的好处是:
class Person{
//成员属性
private int age;
private String name;
//成员方法
void eat(){
System.out.println("吃饭");
}
void sleep(){
System.out.println("睡觉");
}
private void work() {
System.out.println("上班");
}
}
public class Text_private {
public static void main(String[] args) {
//在测试类里创建Perso对象
Person person = new Person();
//person.age = 18;//报错,private修饰不能使用
//person.work();
person.eat();
person.sleep();
}
}
运行结果
**解决方法:**对外提供set(),get()方法 在eclipse中,位于source栏下面的Getters and Setters,自动生成设置和获取属性的方法
class Person{
//成员属性
private int age;
private String name;
//获取属性的方法
public int getAge() {
return age;
}
//设置属性的方法
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//成员方法
void eat(){
System.out.println("吃饭");
}
void sleep(){
System.out.println("睡觉");
}
private void work() {
System.out.println("上班");
}
}
public class Text_private {
public static void main(String[] args) {
//在测试类里创建Perso对象
Person person = new Person();
person.setAge(18);
person.setName("迪丽热巴");
System.out.println(person.getAge());
System.out.println(person.getName());
person.eat();
person.sleep();
}
}
定义
构造方法也叫构造函数,构造器,构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的创建或者对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载,构造方法可以自己定义也可以使用系统提供的默认构造方法。
形式
可以无参也可以有参
修饰符 类名(【参数】) {
代码……
}
练习
class Person{
//成员属性
private int age;
private String name;
//无参构造方法
Person(){}
//有参构造方法
Person(int age,String name){
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
}
public class Text_private {
public static void main(String[] args) {
//在测试类里创建Perso对象
//创建一个匿名对象(没有名字的对象)
new Person();
//创建Person对象
Person person = new Person();
//创建Person对象并对属性初始化
Person person1 = new Person(18,"迪丽热巴");
//将对象以字符串输出
System.out.println(person1.toString());
}
}
(1)在类的内部,方法的外部,的代码块 {}
(2) 通常用于抽取构造方法中的共性代码
(3) 每次调用构造方法前都会调用构造代码块,优先于构造方法执行
public class Text2 {
String country;
//构造代码块
{
country = "中国";
}
//构造方法
Text2(){
System.out.println("1号选手来自"+country);
}
Text2(int a){
System.out.println(a+"号选手来自"+country);
}
public static void main(String[] args) {
Text2 t1 = new Text2();
Text2 t2 = new Text2(2);
}
}
运行结果
由结果可知,先是构造代码块先执行,将country变量赋值,然后在创建对象时构造方法执行使用到country变量
1、 在方法里面的代码块
2、 通常用于控制变量的作用范围,出了括号就失效
3、 变量的范围越小越好,成员变量会有线程安全问题
4、 总结:执行顺序:
构造代码块是最优先的,局部代码块顺序执行
public class Text2 {
{
System.out.println("构造代码块");
}
Text2(){
System.out.println("构造方法");
}
void method() {
{System.out.println("局部代码块");}
}
public static void main(String[] args) {
new Text2().method();
}
}
//测试this关键字
public class Text_this {
String name;
int age;
//参数名和成员变量一样,引用this关键字区别
public String toString(String name,int age) {
this.name = name;//this.name表示使用成员变量,并将参数赋值给它
this.age = age;//如果不用this区分,根据变量使用的就近原则,则使用到的是局部变量
return "姓名"+ this.name +",年龄"+ this.age;
}
Text_this(){
this("赵丽颖",18);//调用自身的有参构造方法,并且只能出现在第一行
}
//有参构造方法
Text_this(String str,int age){
System.out.println("姓名"+str+",年龄"+age);
}
public static void main(String[] args) {
System.out.println(new Text_this().toString("迪丽热巴", 18));
}
}
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类(子类),子类能继承已有类的数据属性和行为,并能扩展新的能力。
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类/超类/基类,只能继承一个父类,Java只支持单继承。
这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。提高复用性:只要继承父类,就能有一样的功能
语法: class A extends B { }
//父类
class Parent{
int age;
String name;
void eat() {
System.out.println("吃饭");
}
void sleep() {
System.out.println("睡觉");
}
}
//子类
class Son extends Parent{
//子类可以拥有从父类继承到的属性和方法
}
public class Text {
public static void main(String[] args) {
//创建子类对象
Son son = new Son();
//访问从父类继承的属性和方法
son.age = 18;
son.name = "张三";
System.out.println(son.age +" " + son.name);
son.eat();
son.sleep();
}
}
class Fu{
int age;
String name;
public Fu() {
System.out.println("父类的无参构造方法");
}
Fu(int age,String name){
this.age = age;
this.name = name;
System.out.println("父类的有参构造方法");
}
}
class Zi extends Fu{
Zi(){
super(18,"父");
//super();//注:不能同时调用父类的几个构造方法
//访问父类的属性
System.out.println(super.age);
System.out.println(super.name);
}
}
public class Text_super {
public static void main(String[] args) {
new Zi();
}
}
public class Text_static {
int age;
static String country = "中国";//静态资源——类变量
public static void main(String[] args) {
method();
Text_static.method1();
}
private static void method1() {
System.out.println("静态方法");
}
//静态资源——静态方法
private static void method() {
System.out.println("来自"+country);
//System.out.println(age);静态不能访问非静态
}
}
静态代码块,构造代码块,构造方法,局部代码块,静态方法的执行顺序
1、 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
2、 构造代码块:在调用构造方法前会自动调用,每次创建对象都会被调用
3、 局部代码块:方法里的代码块,方法被调用时才会执行
4、 静态代码块:static{ },位置:在类里方法外
public class Text {
public static void main(String[] args) {
new Text_staticSequence().method();
System.out.println("_________________");
new Text_staticSequence().method1();
}
}
class Text_staticSequence {
//构造代码块
{
System.out.println("构造代码块");
}
//构造方法
public Text_staticSequence() {
System.out.println("构造方法");
}
//静态方法
public static void method() {
System.out.println("静态方法");
}
//静态代码块
static {
System.out.println("静态代码块");
}
//普通方法
void method1(){
System.out.println("普通方法");
//局部代码块
{
System.out.println("局部代码块");
}
}
}
/**
* 多态:
* 前提:继承关系,方法重写
* 口诀:父类引用 指向 子类对象(向上转型)
* @author TEDU
*/
public class Text1 {
public static void main(String[] args) {
Animal a = new Cat();//编译看左边,运行看右边,
//只能使用父类提供的,运行时看new的对象,
//即不能使用子类特有的方法
a.eat();
a.sleep();
a.catchFood();
System.out.println(a.age+a.name);//多态使用的是父类成员
a.show();//静态方法不可以重写
}
}
class Animal{
int age;
String name;
Animal(){
this.age = 18;
this.name = "动物";
}
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
public void catchFood() {
System.out.println("捕食");
}
public static void show() {
System.out.println(1);
}
}
class Cat extends Animal{
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("猫睡觉");
}
public static void show() {
System.out.println(2);
}
}
package cn.tedu.day09;
public class Text2 {
public static void main(String[] args) {
//Animal an = new Animal();错误,抽象类不能实例化
Animal cat = new Cat();//多态
cat.catchFood();
cat.eat();
cat.sleep();
}
}
//抽象类
abstract class Animal{
//构造方法
Animal(){
System.out.println("动物类祖先");
}
//抽象方法
public abstract void eat() ;
public abstract void catchFood();
//非抽象方法
public void sleep() {
System.out.println("冬眠");
}
}
//非抽象类
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void catchFood() {
System.out.println("猫捉老鼠");
}
}
小练习
模拟老师教书,要求使用抽象类,有教基础的和教框架的老师
package cn.tedu.day09;
public class Text4 {
public static void main(String[] args) {
//javase老师
Teacher t1 = new Teacher1();
t1.setAge(20);
t1.setName("渣渣");
System.out.println(t1.getAge()+t1.getName());
t1.teach();
//javaee老师
Teacher t2 = new Teacher2();
t2.setAge(28);
t2.setName("大牛");
System.out.println(t2.getAge()+t2.getName());
t2.teach();
}
}
//老师类
abstract class Teacher{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
abstract void teach();//教书方法
}
//javase老师
class Teacher1 extends Teacher{
@Override
void teach() {
System.out.println("教java基础");
}
}
//javaee老师
class Teacher2 extends Teacher{
@Override
void teach() {
System.out.println("教java框架");
}
}
概述
Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。Java接口和Java抽象类代表的就是抽象类型,就是需要提出的抽象层的具体表现。OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些太有用的抽象类型做为java结构层次上的顶层。
特点
接口中都是抽象方法,不存在其他方法
通过interface关键字创建接口
通过implements让子类来实现
可以理解成,接口是一个特殊的抽象类
接口可以支持多继承,多实现
接口和类之间可以多实现,接口和接口之间可以多继承
接口是对外暴露的规则,是一套开发规范
接口提高了程序的功能扩展,降低了耦合性
入门案例
public class T {
public static void main(String[] args) {
Zi z = new Zi();
z.study();
z.teach();
}
}
interface Fu{
public abstract void study();
public abstract void teach();
}
//实现+重写
class Zi implements Fu{
public void study(){
System.out.println("Zi..study()");
}
public void teach(){
System.out.println("Zi..teach()");
}
}
package cn.tedu.day10;
public class Text_inteface {
public static void main(String[] args) {
Cla cla = new Cla();
//接口的好处:突破单继承的局限,提高程序的功能扩展
cla.open();
cla.opening();
cla.close();
cla.closing();
}
}
interface Interface1{
public abstract void open();
public abstract void opening();
}
interface Interface2{
public abstract void close();
}
abstract class Abs implements Interface1{
public abstract void open();
//当一个类是抽象类时,去实现一个接口就可以不用全部重写里面的抽象方法
}
interface Interface3 extends Interface1,Interface2{
//接口可以多继承
public abstract void closing();
}
class Cla implements Interface1,Interface2,Interface3{
//类可以多实现几个接口,但是要全部重写接口里的抽象方法
@Override
public void closing() {
// TODO Auto-generated method stub
System.out.println("正在关闭");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("关闭");
}
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("打开");
}
@Override
public void opening() {
// TODO Auto-generated method stub
System.out.println("正在打开");
}
}